Ejemplo de muestra utilizando el núcleo de Asp.net
Enlace del vídeo grabado: https://www.youtube.com/watch?v=oVj1IHw8GLU
Descripción general de DI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core admite el patrón de diseño de software de inyección de dependencias (DI), que es una técnica para lograr la inversión de control (IoC) entre clases y sus dependencias.
A través del contenedor IoC, podemos lograr
En el núcleo de Asp.net, IoC Container tiene interfaces integradas.
El siguiente ciclo de vida DI será
Básicamente existen dos tipos de servicios en ASP.NET Core:
Servicios de marco: servicios que forman parte del marco ASP.NET Core, como IApplicationBuilder, IHostingEnvironment, ILoggerFactory, etc.
Servicios de aplicación: los servicios (tipos o clases personalizados) que usted, como programador, crea para su aplicación.
El controlador Asp.Net Core MVC solicita dependencias explícitamente a través de constructores 1. Inyección de constructor 2. Inyección de método (nivel de acción) 3. Inyección adecuada (no compatible) 4. Inyección de vista
Inyección de constructor: - Los servicios se agregan como parámetro del constructor y el tiempo de ejecución resuelve el servicio desde el contenedor de servicios (IServiceCollection-- DiContainer). Los serviciosa generalmente se definen utilizando clases (interfaces) no concretas.
Inyección de método: - El uso del atributo [FromService] permite inyectar el servicio directamente en un método de acción sin utilizar la inyección del controlador.
Inyección de propiedades Actualmente, el contenedor IOC incorporado (Asp.net core) no admite la inyección de propiedades. Para esto, puede optar por contenedores de servicios integrados (IOC) de terceros.
Ver inyección El uso de la directiva [Inject] permite inyectar el servicio directamente en la página de visualización sin utilizar el controlador o la inyección de método.
El contenedor IoC incorporado admite tres tipos de vida útil:
En el ejemplo de ejemplo, la interfaz de servicio "IMyDependency" define el método "WriteMessage"
public interface IMyDependency
{
void WriteMessage(string message);
}
Esta interfaz se implementa mediante un tipo concreto, MyDependency:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
Ahora, registra el servicio "IMyDependency" con el tipo concreto "MyDependency" (en startup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
Aquí el método Add() de la instancia "IServiceCollection" se utiliza para registrar un servicio con un contenedor IoC. El "ServiceDescriptor" se utiliza para especificar el tipo de servicio y la implementación concreta. Esto registrará nuestro servicio en el contenedor con el valor predeterminado "Singleton".
Ahora, inyectemos servicios con diferentes tiempos de vida.
Singleton (Caso de uso: cuando necesitamos crear un servicio estatal):
servicios.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
Transitorio (Caso de uso: cuando necesitamos crear un servicio sin estado):
servicios.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
Con alcance (caso de uso: servicio de base de datos):
servicios.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
También podemos inyectar los servicios utilizando métodos de extensión integrados.
Semifallo
servicios.AddSingleton
Transitorio
servicios.AddTransisent
Alcance
servicios.AddScoped
clase pública HomeController: Controlador {servicio IMyDependency privado de solo lectura;
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
clase pública HomeController: Controlador {
public IActionResult Index()
{
return View();
}
}
En índice.cshtml
@{ ViewData["Título"] = "Página de inicio"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
clase pública HomeController: Controlador {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}