Pergunta
Estou investigando o uso de Autofac em nossa aplicação web tendo anteriormente utilizado Castelo de Windsor no passado.
A única coisa que eu realmente gosto com Autofac é ser capaz de expressar a construção componente dinâmico através de expressões Lamda, em vez de criar DependancyResolvers etc., em Windsor.
Um cenário que tenho é que eu quero um determinado componente a ser registrado no escopo nível de sessão ASP.NET. Com Windsor eu iria criar / fonte de um novo LifestyleManager, porém com Autofac eu vim com isso:
//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
HttpContext current = HttpContext.Current;
//HttpContext handes delivering the correct session
Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;
if (instance == null)
{
instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
current.Session["SessionContext"] = instance;
}
return instance;
})
.FactoryScoped();
O que em algum momento eu poderia ser capaz de se transformar em um método de extensão. Eu aceito este Implemtation vai explodir se o HttpContext.Current.Session é nulo, uma vez que só deve ser usado em um aplicativo web.
A questão é:
O que é a melhor prática para o registo tal em Autofac. Eu vi um monte de menção sobre o uso de recipientes aninhados etc, mas há exemplos concretos, e estou ansioso para entender o que pode estar errado com a abordagem acima (única coisa que posso pensar é o material automática eliminação).
Graças.
Solução
Este parece bem.
Marcando o componente 'ExternallyOwned ()' irá garantir que Autofac não chama Dispose()
nele.
A única Gotchas aqui são de que seu componente de escopo de sessão poderia resolver as dependências de sua própria através do contêiner atual, e, assim, manter referências a coisas que podem pertencer ao pedido atual (por exemplo.) Isso deve ser fácil de detectar, em testando embora.