簡體   English   中英

ASP.NET MVC競爭條件? 工廠單例靜態詞典

[英]ASP.NET MVC Race Condition? Factory Singleton Static Dictionary

我有以下單例類,用作在Web應用程序中創建對象的工廠。 但是,我發現在負載測試期間遇到了某種競爭狀況。 我應該遵循更好的模式嗎?

public class SearchProviderFactory {
    private static SearchProviderFactory factory = null;        
    private static Dictionary<string, Type> providerMap = new Dictionary<string, Type>();

    private SearchProviderFactory() {
        // Error on the line below
        providerMap.Add("company_name", Type.GetType("MyApp.CompanySearchProvider"));
        providerMap.Add("job_title", Type.GetType("MyApp.JobTitleSearchProvider"));
    }

    public static SearchProviderFactory Instance {
        get {
            if (factory == null) {
                factory = new SearchProviderFactory();
            }

            return factory;
        }
    }
}

我收到以下錯誤,即使似乎私有構造函數不應被多次調用。

System.ArgumentException: An item with the same key has already been added.
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at MyApp.SearchProviderFactory..ctor() in c:\MyApp\_scm\app\src\trunk\MyApp\SearchProviderFactory.cs:line 7

您的代碼與MSDN文章上討論C#中Singleton實現的示例代碼幾乎相同。 那篇文章很好,我推薦。

他們的建議是使用an添加一個lock()語句以實現關鍵部分。 在您的代碼中,將類似於:

public class SearchProviderFactory {
    private static volatile SearchProviderFactory factory;        
    private static Dictionary<string, Type> providerMap = new Dictionary<string, Type>();

    private SearchProviderFactory() {
        // Error on the line below
        providerMap.Add("company_name", Type.GetType("MyApp.CompanySearchProvider"));
        providerMap.Add("job_title", Type.GetType("MyApp.JobTitleSearchProvider"));
    }

    public static SearchProviderFactory Instance {
        get {
            if (factory == null) {
                lock (providerMap)
                {
                    if (factory == null) {
                        factory = new SearchProviderFactory();
                    }
                }
            }

            return factory;
        }
    }
}

我沒有編譯這段代碼,更不用說對其進行壓力測試了。 如果您嘗試過,請告訴我是否可行!

暫無
暫無

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

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