gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:38 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com