gpt4 book ai didi

c# - build 更好的工厂

转载 作者:行者123 更新时间:2023-11-30 13:48:22 26 4
gpt4 key购买 nike

所以我正在做一个项目,我从数据库中获取一些数据 - 有两个数据使这个项目很好,一个我有类型(他们称它们为事件,但它本质上只是转换为 .NET我创建的类型),然后我有 XML,我设计了对象,这样它们就可以很好地反序列化。这一切都很棒,经过单元测试,所有类和方法都遵循单一职责原则。

我的架构技能变得模糊的地方是当我创建工厂来构建业务逻辑来处理我从 XML 创建的 .NET 对象时。

基本上这就是我所拥有的。

  public class EventProcessorFactory : IEventProcessorFactory
{
private readonly List<IEventProcessor> _eventProcessors;

public EventProcessorFactory()
{
_eventProcessors = new List<IEventProcessor>();
}

public IEventProcessor GetProcessor(Type eventType)
{
var typeOfEventProcessor = GetProcessorFromEventType(eventType);
if (_eventProcessors.Any(x => x.GetType() == typeOfEventProcessor))
return _eventProcessors.Single(x => x.GetType() == typeOfEventProcessor);
var processor = BuildProcessorFromType(typeOfEventProcessor);
_eventProcessors.Add(processor);
return processor;
}

private static Type GetProcessorFromEventType(Type eventType)
{
if (eventType == typeof(EnrollmentEventType))
return typeof(EnrollmentEventProcessor);
if (eventType == typeof(ClaimantAccountInfoEventType))
return typeof(ClaimantAccountInfoEventProcessor);
if (eventType == typeof(PhoneUpdateEventType))
return typeof(PhoneUpdateEventProcessor);
if (eventType == typeof(AddressUpdateEventType))
return typeof(AddressUpdateEventProcessor);
if (eventType == typeof(ClientAccountInfoEventType))
return typeof(ClientAccountInfoEventProcessor);
return null;
}

private IEventProcessor BuildProcessorFromType(Type typeOfEventProcessor)
{
return ((IEventProcessor)Activator.CreateInstance(typeOfEventProcessor));
}
}

这样可行,但看起来很笨重。我已经阅读了一些关于使用工厂的文章,但要么我没有阅读正确的文章,要么我没有理解。上面的代码有两个问题。

1) 如果你添加一个新的事件,你需要去修改它,我希望后来的开发人员能够只删除“MyCoolNewEventType”和“MyCoolNewEventProcessor”,而不必修改与事件匹配的方法处理器。

2) 我现在在创建实例时只能调用 .CreateInstance();这很好,因为我没有任何依赖关系,但“事件处理器”可能至少在数据库上有依赖关系。我不是 100% 确定如何处理它,我不想随机调用 Container.Resolve()。

如果有人能指出正确的方向,那将是巨大的。

最佳答案

您正在寻找的是可配置工厂。可以使用依赖注入(inject)框架或最简单的方法 - 外部配置(想到 xml 文件)来完成,它将存储您可能的实现列表,并将按需加载/修改。

有了这个解决方案,你会得到类似的东西

<Processors>
<Processor dllname='' classname=''>
....
</Processors>

并且您必须加载它,通过使用反射/.net 为您提供的任何 xml 读取技术。

关于c# - build 更好的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845005/

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