我的項目已經包含了一些處理程序的工廠(代碼非常簡單):處理程序工廠的依賴注入設計
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];
}
}
處理程序的列表是硬編碼。 Factory位於主程序集中,但應用程序可以在運行時通過附加程序集進行擴展(主應用程序搜索它們並在開始時加載)。其他裝配自定義應用
必須有一種可能性,用新組件替換主組件中的一些處理程序(提供另一種邏輯)。因此,例如,當加載額外的組件時,工廠將按名稱「Second」返回CustomSecondHandler
而不是SecondHandler
。我可以重寫工廠,但更改不得影響已經使用它的代碼。
我想過將字典初始化移動到某些方法RegisterHandlers
,可以在自定義工廠中覆蓋。並添加工廠的依賴注入,因此額外的程序集提供了從現有工廠派生的工廠自己的實現。如果沒有加載額外的組件,則使用默認工廠。但我覺得這種方法有問題。
請提出你的想法。我需要一個乾淨的解決方案,用最少的代碼編寫代碼來提供將替換現有處理程序的定製處理程序
謝謝。
一個絕妙的主意!和一個非常乾淨的解決方案我可能會從字典中刪除'readonly',並添加掃描定製處理程序的附加程序集的方法。謝謝! – 2012-03-07 23:26:32