2009-10-18 56 views
0

我正在玩一些依賴注入(StructureMap)與我的ASP.NET MVC應用程序。很棒。可否依賴注入延遲創建對象所需?

監守StructureMap通過最gready構造(我希望我得到了正確的命名的概念),我認爲它會爲每個參數的對象的實例的印象使用DI,最gready構造。

那麼,是否可以告訴DI框架(在這種情況下,它是StructureMap,但我很好奇它是否可以爲其他任何.NET DI Framework執行此操作)在構造函數被調用時不創建實例,但要延遲這個對象的構造直到需要?

有點兒像一些懶惰的對象構造或東西...

+0

如果你不能,我會感到驚訝。我發現如何禁用默認注入行爲,如果找不到'按設計'方法可能會有用:http://structuremap.sourceforge.net/FAQ.htm#FAQ11 – 2009-10-18 09:12:51

回答

1

支持所有雙單例框架>會話/請求範圍映射典型實例化一個代理對象,而不是「真實」的對象時,一個單一對象的需求訪問會話作用域對象。 「真實」實例的構建通常延遲到第一次調用代理上的方法。

我相信城堡windsor支持這種機制。

0

簡答:是的,你可以這樣做。使用.net 4 Lazy<T>類這樣的註冊你的類型:

x.For(typeof(Lazy<>)).Use(typeof(Lazy<>)) 
.CtorDependency<bool>("isThreadSafe").Is(true); 

對於長的答案和解釋,見我的回答質疑6811956。我認爲它會給你你需要的東西。如果你沒有使用.Net 4,你必須實現你自己的Lazy<T>類來解決這個問題。請參閱問題3207580作爲起點。

Does Structuremap support Lazy out of the box?

Implementation of Lazy<T> for .NET 3.5

UPDATE:在StructureMap 3, 「CtorDependency」 已經變成了 「構造函數」,但在其他方面似乎是工作一樣。

+0

這個問題並沒有問到具體的懶惰類型,所以我認爲這個問題很重要,但有幫助,有點繞道。最簡單的答案就是接受一個Func 來代替你的構造函數參數。 – 2011-09-03 00:27:53

+0

他在問是否有可能延遲創建對象,並且我已經展示瞭如何使用Lazy 類來完成它,因爲這正是它的目的。接受Func 是完成同樣事情的另一種方式,只有現在你負責緩存第一次執行的結果,以便每次引用Func時都不會創建新副本。我發現Lazy 類是避免這些問題的一種乾淨方式,所以這是我建議解決初始問題的方法。 – Mel 2011-09-06 15:14:08