Autofac: Referenz von einem SingleInstance'd Typ eines HttpRequestScoped
Frage
Ich habe eine Anwendung kommt, wo ein gemeinsames Objekt einen Verweis auf ein pro-Request-Objekt benötigt.
Shared: Engine | Per Req: IExtensions() | Request
Wenn ich versuche, die IExtensions
direkt in den Konstruktor von Engine
zu injizieren, auch als Lazy(Of IExtension)
, erhalte ich eine „No Umfang Matching [Anfrage] ist sichtbar aus dem Bereich, in dem die Instanz angefordert wurde.“ Ausnahme, wenn es versucht, jede IExtension
zu instanziiert.
Wie kann ich eine HttpRequestScoped Instanz und dann spritzen sie in eine gemeinsame Instanz erstellen?
Wäre es als gute Praxis werden sie setzen in der Request
Fabrik (und damit inject Engine
in RequestFactory
)?
Lösung
Durch die gemeinsamen Anforderungen an die Lebensdauer von Engine
können Sie nicht inject Anfrage-scoped Erweiterungen hinein. Was könnten Sie haben eine Methode oder Eigenschaft auf Motor, die aktiv eine Sammlung von Erweiterungen der aktuellen Anforderung Umfang lösen wird.
So lassen Sie uns zuerst Engine
einen Konstruktor Abhängigkeit nehmen:
public class Engine
{
public Engine(..., Func<IExtensions> extensionsPerRequest)
{
_extensionsPerRequest = extensionsPerRequest;
}
public IExtensions Extensions
{
get { return _extensionsPerRequest(); }
}
}
Und dann, in Ihrer Autofac Anmeldung:
builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());