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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top