Exemplo de exemplo usando o núcleo Asp.net
Link do vídeo gravado: https://www.youtube.com/watch?v=oVj1IHw8GLU
Visão geral do DI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core oferece suporte ao padrão de design de software de injeção de dependência (DI), que é uma técnica para obter Inversão de Controle (IoC) entre classes e suas dependências.
Através do contêiner IoC, podemos alcançar
No núcleo do Asp.net, o IoC Container possui interfaces integradas.
O seguinte ciclo de vida da DI será
Existem basicamente dois tipos de serviços no ASP.NET Core:
Serviços de estrutura: serviços que fazem parte da estrutura ASP.NET Core, como IApplicationBuilder, IHostingEnvironment, ILoggerFactory etc.
Serviços de aplicativos: os serviços (tipos ou classes personalizados) que você, como programador, cria para seu aplicativo.
O controlador Asp.Net Core MVC solicita dependências explicitamente por meio de construtores 1. Injeção de construtor 2. Injeção de método (nível de ação) 3. Injeção de propriedade (não suportada) 4. Injeção de visualização
Injeção de Construtor: - Os serviços são adicionados como um parâmetro de construtor e o tempo de execução resolve o serviço a partir do contêiner de serviço (IServiceCollection-- DiContainer). Servicesa são normalmente definidos usando classes não concretas (interfaces)
Injeção de método: - Usar o atributo [FromService] permite injetar serviço diretamente em um método de ação sem usar injeção de controlador
Injeção de propriedade Atualmente (núcleo Asp.net), o contêiner IOC integrado não oferece suporte à injeção de propriedade. Para isso, você pode optar por contêineres de serviço integrados (IOC) de terceiros.
Ver injeção usando a diretiva [Inject] permite injetar serviço diretamente na página de visualização sem usar controlador ou injeção de método
O contêiner IoC integrado suporta três tipos de vida útil:
No exemplo de amostra, a interface de serviço "IMyDependency" define o método "WriteMessage"
public interface IMyDependency
{
void WriteMessage(string message);
}
Esta interface é implementada por um tipo concreto, MyDependency:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
Agora, registra o serviço "IMyDependency" com o tipo concreto "MyDependency" (em startup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
Aqui, o método Add() da instância "IServiceCollection" é usado para registrar um serviço com um contêiner IoC. O "ServiceDescriptor" é usado para especificar o tipo de serviço e implementação concreta. Isso registrará nosso serviço no contêiner com padrão como "Singleton"
Agora, vamos injetar serviços com diferentes tempos de vida
Singleton (caso de uso: quando precisamos criar serviço de estado):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
Transitório (caso de uso: quando precisamos criar um serviço sem estado):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
Escopo (caso de uso: serviço de banco de dados):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
Também podemos injetar os serviços usando métodos de extensão integrados
Solteiro
serviços.AddSingleton
Transitório
services.AddTransisent
Escopo
services.AddScoped
classe pública HomeController: Controlador {privado somente leitura IMyDependency _service;
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();
}
}
classe pública HomeController: Controlador {
public IActionResult Index()
{
return View();
}
}
Em Index.cshtml
@{ ViewData["Título"] = "Página inicial"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
classe 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();
}
}