2015-12-12 26 views
0

我們有一個IOrderManager服務,它使用通過AddScoped()在DI中註冊的其他服務。 現在我們需要在OnMessage處理程序中爲某個隊列使用該服務,顯然,這個隊列是在任何請求管道之外引發的。 所以,當我們試圖讓使用的東西我們的服務像asp.net 5 DI:使用外部請求範圍服務

var orderManager = ServiceProvider.GetRequiredService<IOrderManager>(); 

我們得到「無法訪問處置對象...」異常。

問題:是否可以「告訴」DI我們正在進行一些「假請求」處理,以避免處理註冊爲「作用域」的服務?

+0

給請更大的信息。在這個問題上並不清楚。你在哪裏獲得orderManager?從哪裏獲得serviceProvider? –

回答

0

如果您在IOrderManager範圍內使用範圍內的服務,則還需要範圍IOrderManager

如果您不這樣做,那麼當第一次創建IOrderManager實例時,它將從當前請求中「捕獲」範圍依賴關係。

IOrderManager的任何未來使用將繼續使用舊的作用域依賴關係,而不是來自當前請求作用域的依賴關係。

接下來,您應該使用作用域依賴關係的唯一原因是它們以某種方式維護單個請求的狀態,並且需要將該狀態與其他請求隔離。

如果您的IOrderManager實際上並不需要限定爲請求範圍的信息,那麼它不應該被限定範圍,也不應該使用也被限定範圍的依賴項。換句話說,如果您認爲它在活動請求之外應該可用,那麼它根據定義沒有作用域,不需要作用域依賴關係。

1

如果您IOrderManager超出請求範圍,你可以這樣創建每封郵件定製範圍:

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) 
{ 
    var myService = serviceScope.ServiceProvider.GetRequiredService<MyService>(); 
} 
+0

有一個擴展方法,所以你可以縮短代碼到'var serviceScope = app.ApplicationServices.CreateScope()' –