WebApi, Autofac, System.Web.Http.Filters.ActionFilterAttribute Instanz pro Anforderung

8

Wir verwenden Autofac seit langem in unserer Anwendung (MVC 4), wir haben Dutzende von Attributen auf dem Basis-Controller, von dem alles übernommen wird, und es hat alles gut funktioniert. Wenn die Anfrage beginnt, wird unser Service erstellt und dann verfügbar über alle Attribute und über die Controller-Aktion.

Wir betrachten nun WebApi und haben unseren WebApi-Controller erstellt und ein Attribut auf dem Basis-Controller mithilfe des ActionFilterAttribute aus dem HTTP-Namespace erstellt. Das Problem beginnt hier jedoch, wenn der Dienst, der in die Eigenschaft für das Attribut injiziert wird, nicht dieselbe Instanz wie die auf dem ApiController ist. Mit Blick auf den folgenden Link scheint dies ASP bekannt zu sein .NET Web API und Abhängigkeiten im Anforderungsbereich

Allerdings ist die Lösung hier nicht ideal, da wir nicht möchten, dass unsere Controller von der Abhängigkeitsinjektion erfahren. Wir wollen nur den Service verwenden, den wir in die Eigenschaft injizieren, und wissen, dass es pro Anfrage eine Instanz gibt.

>

Wir rufen das an:

%Vor%

Und

%Vor%

Unsere Klassen sind derzeit bei Autofac als InstancePerLifetimeScope registriert, was wir wollen, kann pro Anfrage für MvcControllers und ApiControllers funktionieren.

Ist das möglich?

BEARBEITEN:

Im Grunde gibt diese Zeile den richtigen Dienst für die Anfrage zurück (d. h. dieselbe Instanz, die auch auf dem ApiController ist)

%Vor%

Aber die Property-Injection-Instanz auf dem ActionFilterAttribute ist nicht die gleiche und wenn ich die Autofac-Registrierung in InstancePerApiRequest ändere, erhalte ich den folgenden Fehler:

"Kein Bereich mit einem Tag, der" AutofacWebRequest "entspricht, ist in dem Bereich sichtbar, in dem die Instanz angefordert wurde. Dies bedeutet im Allgemeinen, dass eine Komponente als per-HTTP-Anforderung von einer SingleInstance () -Komponente (oder einer ähnlichen Komponente) angefordert wird Szenario.) Unter der Web-Integration immer Abhängigkeiten von der DependencyResolver.Current oder ILifetimeScopeProvider.RequestLifetime, nie aus dem Container selbst. "

    
user351711 14.05.2014, 15:33
quelle

1 Antwort

10

Dies ist ein bekanntes Problem und ein Designproblem in der Web-API. Wenn Filterinstanzen zuerst in der Web-API erstellt und dann zwischengespeichert werden, muss Autofac die Eigenschafteninjektion mithilfe des Gültigkeitszeitraums der Stammlebensdauer und nicht des Geltungsbereichs der Anforderung auflösen. Es gibt keine Möglichkeit auf Anfrage Autofac jede Eigenschaft Injektion zu tun - die Filter sind effektiv Singletons innerhalb der Web-API und es gibt keinen Haken, um das zu ändern.

Danach, wenn Sie pro Anfrage Dienste in Ihrem Filter benötigen, müssen Sie diesen GetDependencyScope() Trick verwenden.

Weitere Informationen finden Sie unter Autofac auf den folgenden Seiten:

Travis Illig 15.05.2014, 13:29
quelle