Autofac: referência de um tipo único de instance para um httprequestscoped
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 Request
fábrica (e, portanto, injetar Engine
em RequestFactory
)?
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>());