以下是我的导入工厂类。如果我想添加新的 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/