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.

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Deixe uma resposta

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