c# - 可扩展工厂设计模式

标签 c# design-patterns factory-pattern

以下是我的导入工厂类。如果我想添加新的 ImportTypes,那么只需在 ImportTypes 枚举中添加新类型并在工厂类中添加一个案例,它就可以正常工作。

我的问题是如何让它更加独立和易于扩展。假设用户想要添加一个新的 ImportType,然后他没有更改代码,而是编写了自己的 DLL 并实现了接口(interface)……有什么好的建议/想法吗?

导入类型

enum ImportTypes
{
   DefaultImport,
   C2CImport
}

导入接口(interface)

public interface IImportService
{
   void Import(Argument arguments, ImportDefinition config);
}

导入工厂

class ImportFactory
    {
    public static IImportService GetService(ImportTypes type)
    {
       switch (type)
       {
           case ImportTypes.DefaultImport:
               return new DefaultImportService();

           case ImportTypes.C2CImport:
               return new C2CImportService();
       }

       return null;
    }
}

测试

IImportService docImportService = ImportFactory.GetService(ImportTypes.DefaultImport);

最佳答案

为此,您需要支持在运行时注册新服务。因此,您不能使用 enum,因为事先不知道服务;他们需要通过例如字符串来引用:

class ImportServiceHandler
{
    private readonly Dictionary<string, Type> _importServices =
        new Dictionary<string, Type>();

    public ImportServiceHandler()
    {
        RegisterService("DefaultImport", typeof(DefaultImportService));
        RegisterService("C2CImport", typeof(C2CImportService));
    }

    public void RegisterService(string name, Type serviceType)
    {
        if (!serviceType.IsAssignableFrom(typeof(IImportService)))
        {
            throw new ArgumentException("Type specified doesn't implement IImportService", nameof(serviceType));
        }
        _importServices.Add(name, serviceType);
    }

    public IImportService GetService(string name)
    {
        if (_importServices.ContainsKey(name))
        {
            return (IImportService)Activator.CreateInstance(_importServices[name]);
        }
        return null;
    }
}

关于c# - 可扩展工厂设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32716237/

相关文章:

ios - 实例化子类时,如何在父类(super class)中使用 Objective-C 工厂方法?

c++ - 抽象工厂模式中将工厂方法插入哪里?

c# - 如何在 AutoMapper 中全局使用忽略?

c# - 使用 Azure Functions 我的大众交通消息从未成功使用

ios colorWithPatternImage,图案的大小

objective-c - 设计模式建议 : Using an array of custom objects as a singleton

c++ - 多态对象复制

c# - LibUsbDotNet 调用 UsbDevice.AllDevices 时找不到设备

c# - 正则表达式 - 直到字符串第一次出现

design-patterns - 观察者模式与装饰者模式一起使用