Skip to content

Scrutor, um automático injeção de dependência para .Net Core

Se você costuma configurar seu container de injeção de dependência na mão, você precisa conhecer esta biblioteca para .Net Core. Com essa lib, você fica livre para cuidar do que importa.

Se você não sabe os beneficios da técnica de injeção de dependência, aqui está uma rápida explicação sobre esse assunto, https://en.wikipedia.org/wiki/Dependency_injection. Por favor, pare um momento e tente aprender esse conceito importante.

Fala galera, tudo bom? Hoje eu escrevo um rapido artigo sobre .Net Core, eu irei falar sobre Scrutor. Ele é um fantastico lib que configura nossas classes no container de injeção de dependencia.

Quando eu trabalho com .Net Core e eu preciso injetar um serviço (uma classe) em uma controller ou outra classe, eu devo configurar cada serviço. Essa instrução é feita na classe Startup, no método ConfigureServices. Aqui vai um exemplo de código.

services.AddScoped<SolicitadorDeManutencao, SolicitadorDeManutencao>();

O método ConfigureServices é responsável por configurar todos os serviços do meu projeto. Lá, por exemplo, eu configuro EF Core, Identity, MVC Controller e entre outros. O .Net Core usa essa configuração para saber todos os serviços que são necessários e para instanciar eles quando requisitado. Se eu não configuro, os serviços não irão funcionar.

Como você viu acima, a classe foi configurada para ser injetada quando necessário. Portanto se uma controller irá usar um dos serviços acima, o .Net Core sabe como injetar por que isso foi configurado como um serviço.

Esse método tende a ser muito grande, imagine um projeto que tenha 30 serviços, você terá que configura todos os serviços. Eu não gosto disso :(. Se você pensar bem, outros frameworks como Spring Boot não precisam fazer essa configuração, eu apenas decoro a classe com uma tag [Service]. A grande noticia, com Scrutor isso acabou.

Se você deseja aprender mais sobre Scrutor, por favor, acesse https://github.com/khellang/Scrutor.

Para configurar Scrutor em meu projeto, eu preciso de dois passos.

  1. Adicione o pacote.
  2. Configure a lib no método ConfigureServices.

Bora começar?

Eu gosto de usar o .Net CLI, então eu escrevo em um terminal

dotnet add package Scrutor

Ok, agora no método ConfigureServices, classe Startup.cs, eu escrevo algum código.

services.Scan(sc =>
{
    sc.FromCallingAssembly()
        .FromAssemblies(typeof(Program).Assembly)
        .AddClasses()
        .AsSelf();
});

Uma rápida explicação, quando eu uso o método Scan (que só funciona quando o pacote Scrutor está devidamente instalado), eu estou configurando todas as classes para ser configurada como serviço. Veja que eu estou usando a classe “Program” como referencia para a minha class library, onde estão as classes que eu desejo configurar.

Eu estou configurando todas as classes desta biblioteca. Normalmente eu não gosto de adicionar todas as classes para ser configurada como serviço. Por exemplo, eu não configuro Entidades ou Objetos de Valor como serviço. Alias, esse tipo de classe nunca é injetada né?! Então eu costumo fazer um truque.

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ServiceAttribute : Attribute
{

}

Eu posso criar um atributo de classe para decorar todas as classes que são services, por exemplo:

[Service]
public class ConfirmacaoDeUsuario
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly ApplicationDbContext _context;
        ...

Agora, eu posso alterar o meu código onde eu uso o método Scan para configurar no container somente classes decoradas com o atributo [Service].

services.Scan(scan => scan
    .FromAssemblyOf<Program>()
        .AddClasses(@class => @class.WithAttribute<ServiceAttribute>())
        .UsingRegistrationStrategy(RegistrationStrategy.Skip)
        .AsSelf()
);

Agora, eu estou usando também a opção chamada “UsingRegistrationStretegy”, isso significa para não configurar uma classe mais que uma vez.

Galera, eu espero que vocês tenham gostado e vejo você na próxima.

Quer fazer um curso de TDD ou DDD a um preço super barato? Acesse um dos meu cursos https://www.udemy.com/user/stephany-henrique-de-almeida-batista/ e começe hoje mesmo!

 

 

Published in.Net Core

Be First to Comment

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *