0

我有一個簡單的問題。我更新的是Miscrosoft的UnityContainer。我正在用Unity for DI編寫ASP.NET MVC應用程序。 對於連接到我的網絡應用程序的每個用戶,我有不同的容器嗎?或者CONTAINER對所有用戶都一樣? 所以如果我用ContainerControlledLifetimeManager解決一個對象的生命時間,這是否意味着只有一個用戶會話這個對象總是一樣的?ASP.NET MVC中的Unity容器

我希望你能理解。

感謝, 基督教

+0

'我正在爲DI編寫一個ASP.NET MVC應用程序。「 - 請注意Unity項目已經死亡。對於新應用程序,最好使用仍處於活動狀態的[許多其他容器]之一(https://github.com/danielpalme/IocPerformance)。 – NightOwl888

+0

真的嗎?什麼是.net應用程序的最佳選擇?我還需要實施貫穿始終的關切。 Autofac? –

回答

1

壽命是指由DI過程中創建的對象的生命週期。每個請求意味着每個請求都有自己的對象。如果對象依賴於當前用戶,則該請求上的查詢字符串值或請求標頭的值/存在時,PerRequest生存期是適當的。例如,如果您的設置根據服務的位置而有所不同,例如,您從web.config保存了值,那麼該容器很可能是在global.asa中創建的,並且只要容器處於活動狀態,這些對象就可以存活。

一個具體的例子:

你有一個服務爲您的網站的一部分,要遷移到該服務的vNext。用戶可以通過點擊包含參數&myService=vNext的鏈接來選擇加入以查看新行爲。您的Factory方法使用此參數的值爲每個請求選擇vNow或vNext。

下面是一些僞代碼,讓你開始:

container.RegisterInstance<IProductFactory>("enterprise", new EnterpriseProductFactory()); 
container.RegisterInstance<IProductFactory>("retail", new RetailProductFactory()); 
container.RegisterVersionedServiceFactory<IProductFactorySettings, IProductFactory>(); 

在這個例子中RegisterVersionedServiceFactory是一個擴展方法,什麼也不做,但決定使用當前請求其IProductFactory實例。工廠爲此請求提供當前實例(服務的生命週期中只有兩個實例)(每秒數千次)。

這種模式是什麼使您最近可能使用的非常大的網站非常穩定和非常靈活。使用這種完全相同的模式推出新版服務,以幫助保持網站的穩定性。

+0

我的意思是,如果我用ContainerControlledLifetimeManager解決連接到數據庫的對象,這個對象對於連接到我的wep應用程序的所有客戶端都是相同的? –

+0

答案取決於。我認爲通常希望共享連接,以便您的數據庫性能更好。完全不同的談話。我不得不更深入地瞭解我們的代碼,但我的建議是嘗試不同的註冊類型。創建一個具有使用計數的對象,通過多種方式註冊它並詢問每個事物的使用次數。如果它總是一個,那麼你有一個工廠,每個請求創建一個。如果它在每個引用上增加,它就是一個單例。如果使用計數在增加一段時間後出現意外返回到1的錯誤。 –