Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工厂模式,避免不同接口使用相同的开关盒_C#_Design Patterns_Interface_Factory Pattern - Fatal编程技术网

C# 工厂模式,避免不同接口使用相同的开关盒

C# 工厂模式,避免不同接口使用相同的开关盒,c#,design-patterns,interface,factory-pattern,C#,Design Patterns,Interface,Factory Pattern,我有一个实现3个不同接口的模型 public class CustomerRateSettingModel : IBaseFactory, IHandleSearch, IHandleSearchAggregate 我对实现设计模式和尝试实现工厂模式来创建实例非常陌生。 但在编写工厂时,我无法找到适当的方法来避免使用相同的Switch语句 public static IHandleSearch GetClassInstanceForSearch(string className)

我有一个实现3个不同接口的模型

public class CustomerRateSettingModel :  IBaseFactory, IHandleSearch, IHandleSearchAggregate
我对实现设计模式和尝试实现工厂模式来创建实例非常陌生。 但在编写工厂时,我无法找到适当的方法来避免使用相同的Switch语句

  public static IHandleSearch GetClassInstanceForSearch(string className)
    {
        switch (className.ToLower())
        {
            case "customerratesettingmodel":
                return new CustomerRateSettingModel();

            default: return null;
        }
    }

    private static IBaseFactory ManufactureModel(string className)
    {
        switch (className.ToLower())
        {
            case "customerratesettingmodel":
                return new CustomerRateSettingModel();

            default: return null;
        }
    }
有没有正确的方法来处理这种情况

供参考: 调用工厂的代码

  IHandleSearch instance = ModelFactory.GetClassInstanceForSearch(modelName);


 var modelResult = instance.GetSearch(indexName, searchHistory.SearchParameters);
制作一个字典,将名称映射到对象生成器。作为操作员测试对象是否符合所需界面:

static readonly IDictionary<string,Func<object>> Makers = new Dictionary<string,Func<object>> {
    ["customerratesettingmodel"] = () => new CustomerRateSettingModel()
};
public static IHandleSearch GetClassInstanceForSearch(string className) {
    return Construct<IHandleSearch>(className);
}
public static IBaseFactory GetClassInstanceForSearch(string className) {
    return Construct<IBaseFactory>(className);
}
private static T Construct<T>(string className) where T : class {
    if (!Makers.TryGetValue(className.ToLower(), out var makeObject) {
        return null;
    }
    return makeObject() as T;
}

这不是标准的工厂模式。这看起来像某种依赖注入?工厂模式只会创建对象,而不使用字符串来查找对象。我认为您应该研究DI框架,如Unity of SimpleInjector@Liam:U是正确的,我应该发送指示符而不是类名,但是是的,我正在创建一个具体的对象runtime@mjwills:但必须有返回类型,对吗?另一方面,我正在使用由具体实例实现的接口函数,我已经成功地使用MEF实现了factory