【发布时间】:2014-08-25 16:28:11
【问题描述】:
我们有一个多次使用过的模式,我们在不同的 Dll 中实现处理程序和工厂。我们在运行时配置 exe,说明加载了哪些 dll,因此应用程序可以使用哪些处理程序。
我们这样做是因为我们为一些客户提供了自定义处理,而且它提供了很大的灵活性,因为我们可以快速独立地开发新的处理程序,并充满信心地测试和部署它们,因为我们甚至没有触及运行的任何其他部分应用。我们还可以通过简单地放入一个替换 dll 来修补处理程序,我们的客户具有严格的变更管理程序,他们很喜欢这一点。
为此,该模式依赖于两个级别的工厂,实现特定处理程序的特定工厂和一个总体工厂(我们称之为 Provider)。 Provider 选择使用哪个处理程序工厂来创建处理程序。
问题:Windsor 是否包含可以为我们简化此过程的内容?
具体来说,我正在寻找可以省略 Handler 工厂对象的东西,它感觉就像它应该能够做的事情。
我已经阅读了 Typed Factory Facility 和 UsingFactory 和 UsingFactoryMethod 方法,但我看不出它们在这里有什么帮助。
也就是说我经常找到温莎城堡文档很迟钝,所以我可能会遗漏一些明显的东西
或者是否有更好的方法来实现我没有考虑过的相同最终目标。
这里有一些代码来说明,第一条消息、处理程序和工厂接口
public interface IMessage
{
string MessageType { get; }
}
public interface IMessageHandler
{
void Process(IMessage message);
}
public interface IMessageHandlerFactory
{
bool CanProcessType(string type);
IMessageHandler Create();
}
在第二个 DLL 中,我们为 Type1 实现了一个处理程序和工厂
public class Type1MessageHandler
: IMessageHandler
{
public void Process(IMessage message) { }
}
public class Type1MessageHandlerFactory
: IMessageHandlerFactory
{
public bool CanProcessType(string type)
{
return type == "Type1";
}
public IMessageHandler Create()
{
return new Type1MessageHandler();
}
}
在第三个 Dll 中,我们为 Type2 实现了一个处理程序和工厂
public class Type2MessageHandler
: IMessageHandler
{
public void Process(IMessage message) { }
}
public class Type2MessageHandlerFactory
: IMessageHandlerFactory
{
public bool CanProcessType(string type)
{
return type == "Type2";
}
public IMessageHandler Create()
{
return new Type2MessageHandler();
}
}
在 Windows 服务中,我们实现了提供者
public interface IMessageHandlerProvider
{
IMessageHandler Create(string messageType);
}
public class MessageHandlerProvider
: IMessageHandlerProvider
{
IEnumerable<IMessageHandlerFactory> factories;
public MessageHandlerProvider(IWindsorContainer wc)
{
factories = wc.ResolveAll<IMessageHandlerFactory>();
}
public IMessageHandler Create(string messageType)
{
foreach (var factory in factories)
if (factory.CanProcessType(messageType))
return factory.Create();
throw new UnableToFindMessageHandlerFactoryForType(messageType);
}
}
真正需要handlers的服务只使用Provider
public class MessageService
{
public MessageService(IMessageHandlerProvider handlerProvider) {}
}
【问题讨论】:
标签: castle-windsor factory factory-pattern