Injeção de dependência automática com o Scrutor no .NET

Em alguns casos, pode ser trabalhoso e repetitivo registrar manualmente todos os serviços que precisamos injetar das nossas classes. Por exemplo, se temos uma interface IRepository e várias classes que a implementam, como CustomerRepository, ProductRepository, OrderRepository, etc., teríamos que registrar cada uma delas individualmente na ServiceCollection.

O Scrutor é uma biblioteca que simplifica o registro de injeção de dependências com base no Microsoft.Extensions.DependencyInjection. Ele permite carregar assemblies e registrar tipos que atendem a determinados critérios, como implementar uma interface específica ou ter um atributo específico.

Neste post, vamos entender como usar o Scrutor para simplificar a injeção de dependência de forma limpa e concisa .no .NET 7.

Pré-requisitos

  • Visual Studio 2022 (.NET 7.0)
  • Packages:

A solução com o Scrutor

Para usar o Scrutor, você precisa chamar o método Scan na instância IServiceCollection e fornecer uma expressão lambda que defina como verificar e registrar seus serviços. Por exemplo, o código a seguir verificará o assembly atual e registrará todas as classes públicas e não abstratas que implementam uma interface com o mesmo nome, exceto o “I” inicial:

Isso equivale a registrar manualmente cada serviço assim:

Deixando sua classe Program.cs bem mais limpa:

Como você pode ver, o Scrutor pode economizar muitos códigos e tornar seu registros mais consistentes e fáceis de manter.

Você também pode utilizar outros métodos para filtrar os tipos, como TakingAttribute, AssignableTo ou InNamespace:

Uma das funcionalidades do Scrutor é a possibilidade de cadastrar seus serviços AsSelf, o que significa que o serviço será cadastrado com seu próprio tipo como tipo de serviço, ao invés de uma interface ou classe base. Isso pode ser útil quando você deseja resolver o serviço por seu tipo concreto ou quando não possui uma interface ou classe base para seu serviço.

E é possível personalizar o processo de registro de injeção de dependência utilizando diferentes métodos e opções, por exemplo:

  • Especifique diferentes assemblies ou namespaces para digitalizar
  • Filtre as classes por nome, atributo ou predicado personalizado
  • Registre as classes como elas mesmas, como uma interface específica ou como todas as interfaces implementadas
  • Use diferentes tempos de vida (singleton, scoped ou transient) ou funções personalizadas
  • Substituir ou decorar registros existentes

Conclusão

O Scrutor permite que você escaneie e registre as injeções de dependência com uma quantidade mínima de código. Ele também oferece suporte a várias opções de personalização para atender às suas necessidades. Se você estiver utilizando injeção de dependência em suas aplicações .NET, recomendo que você experimente o Scrutor e veja como ele pode melhorar a qualidade e a produtividade do código.

Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/sample-scrutor

Deixe uma resposta