2012-01-16 67 views
1

我需要檢查某個接口的實例是否已經由結構映射創建。我已經嘗試過ObjectFactory.GetInstance(),但是這會在調用時創建一個新的T實例,並且T的具體實例不存在。我只想檢查一個T的實例是否已經被創建(而不是創建一個新的)。我需要這個來強制通過某個類創建實例)。StructureMap - 檢查某個類/接口的實例是否已經創建

+1

我很好奇,你能解釋一下爲什麼你需要這樣做嗎?如果您需要發現一個實例是否已經創建,可能這表明您正在嘗試管理一個單例,該單元可以配置爲自動執行。 – Clafou 2012-01-16 12:04:41

+0

我想通過一個特定的類強制創建一個NHibernate會話(打開和關閉事務,配置等)。這個類是通過屬性注入創建的。所有其他類(存儲庫)應該只能夠獲得已經創建的ISession。所以我需要調用一些結構映射函數,它只獲取一個已經創建的ISession對象,否則它應該拋出一個錯誤或者返回null。 ...而Session是基於http上下文的,而不是單例。 – zszep 2012-01-16 12:17:24

+0

也許你可以通過創建一個新的類庫來控制對獨特的NHibernate Session的訪問(它可以讓你檢查它是否已經創建並顯式創建)並讓StructureMap將這個存儲庫類型對象注入爲單例? – Clafou 2012-01-16 12:32:32

回答

1

如果StructureMap已經創建了接口的實例,則不能問這個StructureMap。

但是,它具有許多生命週期管理功能,可以控制它是創建新實例還是返回先前創建的緩存實例。

您可以告訴StructureMap創建HttpContextScoped實例,以便它爲給定的HTTP請求返回相同的實例。

這聽起來像你真正想知道的是如何用一個StructureMap處理Web應用程序中的NHibernate會話。嘗試: http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html

+0

約書亞。現在發現這是不可能的。您提到但可以「控制結構圖是否創建新實例,還是返回先前創建的緩存實例」。如果這是真的,我可以嘗試獲得一個緩存實例。如果它不在容器中,我應該得到一個空對象。你可以給一個小的代碼片段如何做到這一點。至於我的NHibernate問題,我已經解決了它檢查事務是否打開(事務只在一個位置打開)。 – zszep 2012-01-18 12:51:50

+1

至於你提到的例子,我之前已經看到它。我基於以前的會話管理基於類似的示例,但我不喜歡它在每個Web請求前創建NHibernate會話的事實。我嘗試了Ayende的NHibernate profiler(試用版),並且很震驚地看到創建了多少NHibernate會話(即使這樣的會話比較輕微)。即使對於靜態jpeg獲取,也創建了一個會話。 – zszep 2012-01-18 12:59:33

4

你應該能夠做到這一點使用:

ObjectFactory.Model.InstancesOf<IYourInterface>().First().ObjectHasBeenCreated(); 

注意,對於辛格爾頓的HttpContext或混合生命週期的情況下,這只是工作。

相關問題