3

注1:我想清楚:我不是試圖延遲加載依賴或注入懶惰類型。惰性依賴註冊與團結

大多數(所有?)IoC容器需要元數據與容器來描述如何當被問及某種類型應該可以解決註冊;這包括接口的實現,對象的生命週期等等。在過去幾年中,基於流利/慣例的API已經添加到大多數(所有)IoC容器中,這在提供這種容器時減少了很多噪音元數據到容器。

隨着ninject,我使用基礎的方法來註冊我的元數據的慣例,但是我做它的需求,而不是前期。在創建〜10個對象的集成測試場景中,這會節省巨大的性能;您將失去必須在每次測試中註冊整個應用程序依賴項的開銷。

注2:請不要告訴我,你不應該在集成測試使用IoC容器。

有一定的壓力移動到使用Microsoft組件時可用,所以團結就是在我的視野。我有基於約定的註冊工作,但我無法弄清楚如何在Ninject中按需要/懶洋洋地「發現」這些元數據。

我第一次嘗試實現這個是圍繞UnityContainer實例使用一個包裝器,並且在包裝器上調用GetInstance(type)時,我可以查詢容器以查看該類型是否已註冊。如果沒有,我可以調用我的約定,發現元數據並註冊類型。然而,這種方法只能深入一層。如果該類型注入更多的依賴關係,則每個依賴關係都不會反饋回GetInstance(type)方法,從而成爲我的困境。

問題:我怎樣才能懶洋洋地/點播型註冊添加到Unity?

來源將是很好的,但一個指向容器中的鉤會一樣好。我嘗試了繼承,但沒有什麼可以像Ninject一樣重寫。

+0

你能舉一個例子嗎,你如何在Ninject中做到這一點?我可能能夠弄清楚如何在Unity中做同樣的事情。然而,直覺上,我同意這樣的觀點,即在大多數情況下,懶惰註冊沒有好處。在Unity中,註冊一個類型映射只是創建六個非常小的對象並將它們放入特定的集合中。它不能太慢可以嗎? – 2011-03-11 11:34:12

回答

5

首先 - Unity的每個問題都可以,而且應該通過避免使用它來解決。

如果這不是一種選擇,我認爲Unity沒有選擇按需註冊東西。

作爲一個旁註,我仍然不會默認嘗試註冊懶惰的東西。一個容器產生不可接受的性能這一事實並不意味着另一個容器會出現這種情況。你有沒有先測量一下?

我在測試中使用容器(溫莎)很多,我從來沒有發現預先註冊是一個問題。更重要的是,(我知道那些測試是如此不同的規則適用)我認爲不預先註冊的東西是錯誤的。即使允許,我也知道大多數容器仍然針對前期註冊進行了大量優化,因此您的性能增益可能爲零,甚至您可能發現自己看到的數字比通過正確的方式進行前期註冊更差。

+2

+1。阿門兄弟! – Steven 2011-03-09 08:06:19

+7

每當你說出「Unity的每一個問題都可以,而且應該通過避免使用它來解決」這樣的話,那麼也可以提供一個你爲什麼這樣想的理由。否則,答覆可能會毫無根據地出現。 – 2011-03-12 03:39:27

+1

我不認爲這與問題有關。任何嘗試Unity的人都可以通過谷歌搜索,甚至可以通過搜索搜索引擎來快速瞭解它並非毫無根據。 – 2011-03-12 04:09:20