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

Wir verwenden seit langer Zeit Autofac in unserer Anwendung (MVC 4). Wir haben Dutzende von Attributen auf dem Basis-Controller, von denen alles geerbt wurde, und alles hat einwandfrei funktioniert. Wenn die Anfrage beginnt, wird unser Service erstellt und ist dann über verfügbar alle Attribute und auf die Controller-Aktion.

Wir betrachten nun WebApi und haben unseren WebApi-Controller erstellt und ein Attribut auf dem Basiscontroller mit dem ActionFilterAttribute aus dem HTTP-Namespace erstellt. Das Problem beginnt jedoch hier, wo der in die Eigenschaft des Attributs eingespeiste Dienst nicht dieselbe Instanz wie der auf dem ApiController ist. Unter dem folgenden Link scheint dies bekannt zu seinASP.NET-Web-API und Abhängigkeiten im Anforderungsbereich

Die Lösung hier ist jedoch nicht ideal, da wir nicht möchten, dass unsere Controller über die Abhängigkeitsinjektion informiert werden. Wir möchten lediglich den Dienst verwenden, den wir in die Eigenschaft injizieren, und wissen, dass es sich um eine Instanz pro Anforderung handelt.

Wir nennen das:

  builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

Und

  GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

Unsere Klassen sind derzeit bei Autofac als InstancePerLifetimeScope registriert. Wir möchten, dass jede Anfrage für MvcController und ApiController funktioniert.

Ist das möglich?

BEARBEITEN:

Im Grunde gibt diese Zeile den richtigen Dienst für die Anforderung zurück (d. H. Dieselbe Instanz, die sich auch auf dem ApiController befindet).

var service = actionContext.Request.GetDependencyScope().GetService(typeof(IOurService);

Die Eigenschaftsinjektionsinstanz auf dem ActionFilterAttribute ist jedoch nicht dieselbe. Wenn ich die Autofac-Registrierung in InstancePerApiRequest ändere, wird der folgende Fehler angezeigt:

"In dem Bereich, in dem die Instanz angefordert wurde, ist kein Bereich mit einem Tag sichtbar, der mit" AutofacWebRequest "übereinstimmt. Dies zeigt im Allgemeinen an, dass eine als HTTP-Anforderung registrierte Komponente von einer SingleInstance () - Komponente angefordert wird (oder ein ähnliches Szenario.) Fordern Sie bei der Webintegration immer Abhängigkeiten vom DependencyResolver.Current oder ILifetimeScopeProvider.RequestLifetime an, niemals vom Container selbst. "

Antworten auf die Frage(1)

Ihre Antwort auf die Frage