2017-08-15 67 views
0

我已經瀏覽了大部分文檔,而且我仍然不確定依賴關係作用域的具體用法。在WebApi2中使用Autofac示波器

當我的請求命中我的控制器時,我通常可以使用控制器的依賴關係(通過構造器注入提供),而不用擔心自己。

不過,我寫一個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); 
    } 

我開始試着做:

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

但是 - 儘管它的作品 - 似乎關閉範圍,防止我的控制器從偶數初始化正確。

我可以這樣做:

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

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

但不是創建資源泄漏?當請求結束時,RequestLifetimeScope會被丟棄嗎?

如果您可以使用Autofac解析服務爲我提供正確,最佳實踐樣式的基本DelegatingHandler示例,那將對我有很大幫助。

回答

1

請求級別的依賴範圍是爲您創建併爲您處理的。只要得到它(不在using內),並根據需要解決。當然,確保Autofac中間件在之前執行,因此可以爲您創建範圍;如果是這樣的話,你也會在之後清理。自動。

+0

我試過「我能做」的代碼,它似乎工作正常。如果我理解正確,這是解決我的服務的正確方法嗎? – Gerino

+1

我只是GetDependencyScope並從那裏解決,但是,如果你必須做服務位置而不是DI,那就是這樣。請注意,這不是Autofac特定的 - 這就是Web API的工作原理。 –