2012-04-05 14 views
14

ich registriert habe eine Komponente wie dies in meinem Global.asax.cs lösen Der Fehler, den ich bekomme, ist:Wie Autofac InstancePerHttpRequest

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

Wie bekomme ich das zur Arbeit? Dieser Grund, warum ich es so will, ist, weil der Arbeitskontext Sachen wie das Erhalten des gegenwärtigen Kunden usw. behandelt.

Einige mehr Fragen. Ist es weise/beste Praktiken, sich auf einmal zu registrieren? Werden die Szenarien, die ich brauche, um weitere Komponenten in einer anderen Phase hinzufügen?

+0

Wo Sie versuchen, Ihre Auflösung zu tun? – cecilphillip

+0

Ich spiele nur herum, also wurde dies direkt nach dem Erstellen des Containers in der Anwendung Startmethode gemacht. Ich weiß nicht, wie ich den Container sonst wo in meiner App bekomme? –

Antwort

22

Anmeldungen, die mit InstancePerHttpRequest gekennzeichnet sind, werden voraussichtlich von einem bestimmten verschachtelten Lebenszeitbereich gelöst, der bei jeder HTTP-Anforderung erstellt und entsorgt wird.

Wenn Sie IWorkContext als Konstruktorparameter zu einem Ihrer Controller hinzufügen, werden Sie feststellen, dass eine Instanz injiziert wird. In Ihrem Code versuchen Sie, Ihren Dienst aus dem Gültigkeitsbereich der Stammlebensdauer und nicht aus dem verschachtelten lebenslangen Gültigkeitsbereich "pro Anforderung" zu lösen.

Wenn Sie die Auflösung des Dienstes testen möchten, ohne Ihre Anwendung hochzufahren, müssen Sie einen lebenslangen Bereich mit demselben Tag erstellen, wie er während der HTTP-Anforderung erstellt wurde. Bei der MVC 3-Integration wird der Gültigkeitsbereich des Gültigkeitszeitraums mit "httpRequest" gekennzeichnet.

using (var httpRequestScope = container.BeginLifetimeScope("httpRequest")) 
{ 
    Assert.That(httpRequestScope.Resolve<IWorkContext>(), Is.Not.Null); 
} 

Ich denke, ich werde die MVC-Integration aktualisieren, um den „httprequest“ Tag-Namen öffentlich über die API zu, so dass String-Werte müssen nicht hart codierten. Es ist auch möglich, eine eigene Implementierung ILifetimeScopeProvider an die AutofacDependencyResolver zu übergeben, so dass Sie die Erstellung von Lifetime-Bereichen außerhalb der ASP.NET-Laufzeit steuern können. Dies ist nützlich in Komponententests, wenn keine HTTP-Anfrage verfügbar ist.

+2

Ja, bitte machen Sie den HttpRequestTag in RequestLifetimeScopeProvider öffentlich. Dann müssen wir den Tag-Wert nicht hart codieren. –

1

Ich tue dies in WebForms:

this.RoutingService = ((Global)HttpContext.Current.ApplicationInstance).ContainerProvider.RequestLifetime.Resolve<RoutingService>();