Autofac – assembly scanning

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Hoje vamos falar mais um pouco do Autofac, e mostrar mais um de seus recursos, que é o assembly scanning, que permite o uso de convenções para para achar e registrar seu componentes. É um recurso parecido com o que mostramos anteriormente aqui no post Autofac – registrando classes automaticamente, mas tem algumas diferenças, e deve ser usado em situações um pouco diferentes. Quando você precisar de maior controle, ou for um projeto que novos assemblies podem ser adicionados sem muito controle, e principalmente se sua aplicação trabalha orientada a plugins, e os plugins são desenvolvidos por outras equipes, o recurso apresentado no post anterior é mais indicado, mas se seu cenário é mais simples, e você não precisa de tanto controle, esse recurso vai te atender muito bem.

O Autofac tem um método chamado RegisterAssemblyTypes, que recebe um array de assemblies como parâmtro, podendo ser usado dessa forma:

var assemblies = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assemblies);

Dessa forma, o Autofac vai varrer o Assembly que está em execução, e registrar todas as classes que encontrar, porém ele vai registrar as classes, e se você tiver interfaces que gostaria de utilizar, ele não saberá qual implementação devolver.

Mas resolver isso é bastante simples, e o Autofac nos fornece três métodos para escolhermos como registrar nossos componentes:
-AsSelf: é o padrão, e o Autofac considera ele quando você não definir como quer registrar seus componentes. Ele registra os componentes como eles mesmos, ou seja, quando você pedir por uma classe, é exatamente ela quem você vai receber.

builder.RegisterAssemblyTypes(assemblies).AsSelf();

-AsImplementedInterfaces: o Autofac vai registrar todas as interfaces públicas, e ao pedir por uma instância da interface, o Autofac vai retornar a classe que a implementa. O Autofac desconsidera a interface IDisposable.

builder.RegisterAssemblyTypes(assemblies).AsImplementedInterfaces();

-AsClosedTypesOf: vai registrar todos os tipos que estejam atribuídos a uma instância que receba um generic.

builder.RegisterAssemblyTypes(assemblies).AsClosedTypesOf(typeof(IRepository<>));

Além disso, você pode utilizar padrões e convenções para filtrar apenas os tipos que você pretende registrar, por exemplo, imagine que você quer registrar apenas as classes que terminem com o nome “Repository”:

builder.RegisterAssemblyTypes(assemblies).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();

Você também pode substituir o método EndsWith por StartsWith, ou por qualquer outro que desejar disponível na classe String.

Agora, pode ser que você queira excluir alguns tipos, e o Autofac nos permite isso também, basta usarmos o método Except:

builder.RegisterAssemblyTypes(assemblies).Except<ClienteDTO>();

Você também consegue combinar os métodos acima, com o método As, usado para dizermos ao Autofac, qual serviço iremos pedir para o container:

builder.RegisterAssemblyTypes(assemblies).Where(t => t.Name.StartsWith("Repository")).AsImplementedInterfaces().As<IRepository>();

Para aplicações que estão rodando no IIS, lembre-se de utilizar o método GetReferencedAssemblies, para evitar erros, isso ocorre por quando a aplicação é iniciada no IIS, ele carrega todos os assemblies para o AppDomain, porém, quando ocorre um recycle do ApplicationPool, os assemblies são carregados apenas quando precisam ser utilizados. Para isso, utilize o código abaixo para obter a lista de assemblies:

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

Veja que temos uma série de opções de agilizar o registro de nossas classes e interfaces no Autofac, sem precisar ficar registrando classe a classe como vinhamos vendo anteriormente aqui. Isso agiliza bastante o desenvolvimento, mas deve ser utilizado com um certo cuidado, pois em equipes com muitas pessoas, acaba sendo fácil de algum desenvolvedor não seguir o padrão e acabar gerando dores de cabeça para o restante da equipe e para o projeto. Mas se você tem um projeto com as classes bem definidas e padronizadas, use e abuse dos filtros e convenções para agilizar o registro de suas classes.

Quase 20 anos de experiência no mercado de TI.
Atuação em grandes empresas como Netshoes, Borland, JBS, Bradesco, Hospital das Clínicas, Rede, Prodam, HSPE, Instituto Ayrton Senna, e também em empresas internacionais como Delta Dental, T-Mobile, Pepsi e Mckesson.
Fundador da TecPrime Solutions, administrador da comunidade nopCommerce Brasil, e autor dos sites InvestFacil.net e Desenvolvedores.ninja

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Deixe uma resposta

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