Autofac: Referencia de un tipo SingleInstance'd a un HttpRequestScoped
Pregunta
Tengo una aplicación en la que un objeto compartido necesita una referencia a un objeto por solicitud.
Shared: Engine | Per Req: IExtensions() | Request
Si intento para inyectar el IExtensions
directamente en el constructor de Engine
, incluso como Lazy(Of IExtension)
, consigo un "No alcance coincidente [Petición] es visible desde el ámbito en el que se pidió a la instancia." excepción cuando se trata de crear una instancia de cada IExtension
.
¿Cómo puedo crear una instancia HttpRequestScoped y luego inyectarla en una instancia compartida?
práctica sería considerado bueno para ponerlo en la fábrica de la Request
(y por lo tanto Engine
inyectar en RequestFactory
)?
Solución
Debido a los requerimientos de toda la vida compartidos de Engine
que no puede inyectar extensiones de petición con ámbito en ella. Lo que podría tener es un método o propiedad en el motor que resolverá de forma activa un conjunto de extensiones del ámbito solicitud actual.
Así que, primero, dejar Engine
tomar una dependencia constructor:
public class Engine
{
public Engine(..., Func<IExtensions> extensionsPerRequest)
{
_extensionsPerRequest = extensionsPerRequest;
}
public IExtensions Extensions
{
get { return _extensionsPerRequest(); }
}
}
Y entonces, en su registro Autofac:
builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());