2017-08-15 2 views
0

Ich habe ging durch die meisten der Dokumentation, und ich bin immer noch unsicher über spezifische Verwendung von Abhängigkeitstive.Mit Autofac Bereiche in WebApi2

Wenn meine Anfrage meines Controller trifft, kann ich in der Regel Abhängigkeiten des Controllers verwenden (über Constructor Injection zur Verfügung gestellt) und mich nicht viel darum kümmern.

Allerdings schreibe ich eine Delegating Handler:

public class MyHandler: DelegatingHandler 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     // I need IMyService here 
     return await base.SendAsync(request, cancellationToken); 
    } 

Ich versuchte zunächst zu tun:

using(var scope = request.GetDependencyScope()){ 
    var service = scope.GetService(typeof(IMyService)); 
} 

Aber das - während es funktioniert - scheint den Umfang und zu verhindern, meinen Controller zu schließen von selbst initialisiert korrekt.

ich tun kann:

{ 
     var requestScope = request.GetDependencyScope(); 
     var scope = requestScope.GetRequestLifetimeScope(); 

     var service = scope.Resolve<IMyService>(); 
     // use service 
     return await base.SendAsync(request, cancellationToken); 
} 

aber, dass kein Ressourcenleck schaffen? Wird die RequestLifetimeScope entsorgt, wenn die Anfrage abgeschlossen ist?

Wenn Sie mich mit einer Probe richtig, Best-Practices-Stil Grund DelegatingHandler mit Autofac aufgelöstem Service bieten können, mir das würde sehr helfen. Sie

Antwort

1

Die Abhängigkeit Umfang Anforderungsebene wird für Sie und angeordnet erstellt. Holen Sie es einfach (nicht in einem using) und lösen Sie es, wenn Sie müssen. Natürlich stellen Sie sicher, die Autofac Middleware vor Middleware führt, so dass der Spielraum für Sie erstellt werden; und wenn das der Fall ist, reinigt es nach dir auch. Automatisch.

+0

Ich habe das versucht, Code „Ich konnte tun“, und es scheint gut zu funktionieren. Wenn ich Sie richtig verstehe, ist dies der richtige Weg, meinen Service zu lösen. – Gerino

+1

Ich würde nur GetDependencyScope und von dort lösen, aber ja, wenn Sie Service-Stelle anstelle von DI, so tun müssen. Beachten Sie, dass dies nicht Autofac-spezifisch ist - so funktioniert die Web-API. –