簡體   English   中英

Singleton中的結構圖返回多個實例

[英]Structuremap in Singleton returning multiple instances

我使用命名實例為同一個接口注冊了5個派生類。 所有這些類都注冊為Singleton

For<IBaseInterface>().Singleton().Use<DerivedClass1>().Named("Derived1");
For<IBaseInterface>().Singleton().Use<DerivedClass2>().Named("Derived2");
For<IBaseInterface>().Singleton().Use<DerivedClass3>().Named("Derived3");

有一個靜態類根據輸入解析實例。 但是我觀察到對ObjectFactory.GetInstance的每次調用都會在每個請求而不是Singleton上返回新的實例。 應用程序中也沒有線程。

對於為什么會發生這種情況的任何想法?

編輯:

靜態解決方案助手是否會導致任何問題? 這是我解析實例的方式。 Singleton在示例應用程序中正常工作,但它在我的機器上不起作用。

要添加更多細節 - 該項目是MVC Web API,我正在本地IIS上進行測試。 我很肯定在應用程序中沒有用戶創建的線程。

public static class Resolver
{
    public static IBaseInterface GetHelper(string inputParam)
    {
        if inputParam is "Case1"
            return ObjectFactory.GetInstance<IBaseInterface>("Derived1")
        //Similarly for other instances
    }
}

我會小心你正確使用Dependency Injection容器。 例如,您在帖子中顯示的Resolver類,它只是一種工廠或提供者?

使用依賴注入時,您需要確保並遵循RRR模式:注冊,解析和發布。 注冊應該在您的應用程序的組合根目錄中進行。 對於ASP.Net MVC,它通常位於Global.asax的某個位置,例如在代碼隱藏的Application_Start方法中。 這應該只在每個應用程序池啟動時發生一次(對於IIS)。

如果您偶然傳遞容器(或實例化容器並執行注冊並稍后解決的對象) - 您不應該這樣做 - 您看到的這些“不同實例”可能來自兩個不同的容器。 即使您沒有在容器周圍傳遞,如果您要在某個地方實例化容器,在每次請求之后,容器被垃圾收集並在后續請求中重新創建,您可能會看到單例的“不同實例”正在解析和實例化的對象; 再次,每個來自容器的不同實例。 驗證這一點的一種方法是驗證從容器中解析的對象是否也來自同一個容器實例。

HTH。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM