C# ASP.NET MVC竞赛条件?工厂单例静态字典

C# ASP.NET MVC竞赛条件?工厂单例静态字典,c#,singleton,factory,C#,Singleton,Factory,我有下面的singleton类,它充当在web应用程序中创建对象的工厂。然而,我看到在负载测试期间我得到了某种竞争条件。有没有更好的模式我应该遵循 public class SearchProviderFactory { private static SearchProviderFactory factory = null; private static Dictionary<string, Type> providerMap = new Dictio

我有下面的singleton类,它充当在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;
        }
    }
}

您的代码与C#中正在讨论的单例实现的示例代码几乎相同。那篇文章很好,我推荐它

他们的建议是使用。在您的代码中,这类似于:

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;
        }
    }
}
公共类SearchProviderFactory{
私营静电发生器厂;
私有静态字典providerMap=新字典();
私有SearchProviderFactory(){
//下一行有错误
providerMap.Add(“公司名称”,Type.GetType(“MyApp.CompanySearchProvider”);
providerMap.Add(“job_title”,Type.GetType(“MyApp.JobTitleSearchProvider”);
}
公共静态SearchProviderFactory实例{
得到{
如果(工厂==null){
锁(providerMap)
{
如果(工厂==null){
factory=新的SearchProviderFactory();
}
}
}
返回工厂;
}
}
}

我没有编译这段代码,更不用说对它进行压力测试了。如果你尝试过,请让我知道这是否有效

实际上,我刚刚决定在我的全局初始化中调用实例方法,以确保这种情况不会再次发生。我现在很少看到使用双空检查+锁定技术。现在,大多数人都使用了
惰性
包装器。
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;
        }
    }
}