所以我正在做一个项目,我从数据库中获取一些数据 - 有两个数据使这个项目很好,一个我有类型(他们称它们为事件,但它本质上只是转换为我创建的 .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()。
如果有人能指出正确的方向,那将是巨大的。