Autofac - Antrag lifetime-Bereich kann nicht erstellt werden, weil die HttpContext-nicht verfügbar - aufgrund der asynchronen code?

Kurze Frage: So wie diese unbeantwortet problem

Lange Frage:

Ich nur portiert, einige code über von einem MVC 4 + Web-Api-Lösung, mit Autofac in meine neue Lösung, die auch mit Autofac aber nur mit der Web-Api-2 - (kein MVC 5.1 Projekt, nur ein web-api).

In meinem vorherigen Lösung hatte ich MVC4-und Web-Api, also ich hatte 2 Bootstrapper.cs-Dateien, eine für jeden. Kopiert habe ich nur über die Web-Api-bootstrapper für das neue Projekt.

Nun habe ich 2 andere Projekte in die neue Lösung müssen, ziehen Sie ein Abhängigkeit. Können nur davon ausgehen, ich habe mit DependencyResolver.Current.GetService<T>() obwohl es ein anti-pattern.

Zunächst war dies nicht funktioniert, bis ich die MVC, Dependency Resolver zu den gleichen container:

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

//I had to pull in Autofac.Mvc and Mvc 5.1 integration but this line fixed it
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

Das seltsame ist, zu tun, die nur fixiert es in EINEM dieser Projekte! Hier ist die situation:

 Solution.Web project
      Bootstrapper.cs that registers both dependency resolvers for web api and mvc.

 Solution.ClassLib project
      var userRepo = DependencyResolver.Current.GetService<IUserRepo>(); //Good! :)

 Solution.WindowsWorkflow project
      var userRepo = DependencyResolver.Current.GetService<IUserRepo>(); //Throws exception :(

Ausnahme ist:
Die Anfrage lifetime-Bereich kann nicht erstellt werden, da der HttpContext ist nicht verfügbar.

Nun, bevor wir anfangen, die Schuld des workflow, weiß nur, ich hatte genau dieses set-up funktioniert ganz gut in einer anderen Lösung den workflow in der Lage war, zu verwenden DependencyResolver gut. Also ich vermute, das hatte damit zu tun, mit einer neueren version von Autofac und die Tatsache, dass der workflow läuft asynchron (genau wie die Frage, die ich verknüpft über async-code)

Versuchte ich Wechsel alle Registrierungs-code zu verwenden InstancePerLifetimeScope() statt InstancePerHttpRequest() und versuchen, erstellen Sie einen Rahmen:

using (var c= AutofacDependencyResolver.Current
                     .ApplicationContainer.BeginLifetimeScope("AutofacWebRequest"))
{
   var userRepo = DependencyResolver.Current.GetServices<IUserRepo>();
}

Aber es nicht ändern die Ausnahme. Brechen Sie den code unten sogar noch weiter, hier wird die genaue Täter:

var adr = AutofacDependencyResolver.Current; //Throws that exception 

Wirklich brauchen, um daran vorbei, zu viel Zeit stecken. Belohnen vorhandenen Antwort mit bounty in 2 Tagen

Aber nicht HttpContext tatsächlich existiert im Workflow-Projekt? können Sie einen container erstellen, und versuchen Sie zu lösen IUserRepo direkt aus dem container, ohne .Current? Auch InstancePerLifetimeScope() ist besser als InstancePerHttpRequest.

InformationsquelleAutor parliament | 2014-02-15

Schreibe einen Kommentar