【发布时间】:2012-03-07 22:00:08
【问题描述】:
我的项目已经包含一些处理程序的工厂(代码非常简化):
class HandlersFactory
{
private static readonly Dictionary<string, IHandler> registeredHandlers =
new Dictionary<string, IHandler>
{
{ "First", new FirstHandler() },
{ "Second", new SecondHandler() },
{ "Third", new ThirdHandler() },
};
public bool IsRegisteredHandler(string name)
{
return registeredHandlers.ContainsKey(name);
}
public IHandler GetHandler(string name)
{
if (!IsRegisteredHandler(name))
return null;
return registeredHandlers[name];
}
}
处理程序列表是硬编码的。工厂位于主程序集中,但应用程序可以在运行时使用附加程序集进行扩展(主应用程序搜索它们并在启动时加载)。附加组件自定义应用程序。
必须有可能用新的“替换”主程序集中的一些处理程序(提供另一种逻辑)。因此,例如,加载附加程序集时,工厂将按名称“Second”返回CustomSecondHandler,而不是SecondHandler。我可以重写工厂,但更改不得影响已经使用它的代码。
我考虑过将字典初始化移动到某个方法RegisterHandlers,该方法可以在自定义工厂中被覆盖。并添加工厂的依赖注入,因此额外的程序集提供了从现有工厂派生的自己的工厂实现。如果未加载其他程序集,则使用默认工厂。但我觉得这种方法有问题。
请提出您的想法。我需要一个干净的解决方案,代码编写最少,以提供将替换现有处理程序的自定义处理程序。
谢谢。
【问题讨论】:
标签: c# design-patterns dependency-injection factory-pattern