Pergunta

Eu tenho um aplicativo em que um objeto compartilhado precisa de uma referência a um objeto por solicitação.

Shared:      Engine
                |
Per Req:  IExtensions()
                |
             Request

Se eu tentar injetar o IExtensions diretamente no construtor de Engine, mesmo como Lazy(Of IExtension), Recebo uma "solicitação sem escopo [solicitação] é visível do escopo em que a instância foi solicitada". exceção quando tenta instanciar cada IExtension.

Como posso criar uma instância HttPrequestscoped e depois injetá -la em uma instância compartilhada?

Seria considerado uma boa prática defini -lo no Requestfábrica (e, portanto, injetar Engine em RequestFactory)?

Foi útil?

Solução

Devido aos requisitos de vida compartilhada de Engine Você não pode injetar extensões de solicitação nele. O que você poderia ter é um método ou propriedade no mecanismo que resolverá ativamente uma coleção de extensões do escopo de solicitação atual.

Então, primeiro, vamos Engine Tome uma dependência do construtor:

public class Engine
{
    public Engine(..., Func<IExtensions> extensionsPerRequest) 
    {
        _extensionsPerRequest = extensionsPerRequest;
    }


    public IExtensions Extensions
    {
       get { return _extensionsPerRequest(); }
    }
 }

E então, no seu registro do Autofac:

builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top