2011-03-12 246 views
4

我想看看我是否理解依賴注入。C#依賴注入

我有一個用作解析器的項目。它可以解析分隔文本,鍵值,也將正則表達式。

這樣做的第一種方式是在一個帶開關的功能中。 接下來的方法是把它放在單獨的功能,並根據開關調用它

我想下一個方法是創建一個接口,併爲每種類型實現一個類。這是很多工作?這個問題是否會起作用,或者這樣做會顯示出我還沒有看到的好處。

我相信我的問題源於我最初將實現一個接口,而不是每次我需要一個不同的解析實現一個新類。但除此之外,仍然需要我參加,並將其添加到某種類型的邏輯流程中,因爲我沒有看到如何使用注入框架來實現這一點。

所以說我添加另一種方式來解析,這是基於標籤或XML。創建實現接口的類,並且如果用戶選擇解析該類型的文本,則需要將它們添加到流邏輯中以將它們實例化爲該接口。任何明確的方法來做到這一點?

+1

我不太確定這與依賴注入有什麼關係,我認爲最類似於你所說的概念是[MEF](http://mef.codeplex.com/)。 – R0MANARMY 2011-03-12 18:50:51

+0

我同意,MEF或其他插件模型 – rboarman 2011-03-12 19:02:10

回答

2

我認爲你真正需要的是一個工廠。工廠是一個知道給定一些信息的類,如何創建必要的適當類型的對象。在你的情況下,你會創建一個解析器接口,然後分離實現各種解析器的類。最後,創建一個解析器工廠,給定一些能夠告訴創建哪種解析器的能力,創建並返回所需的解析器類型。這是你的邏輯將去的地方。工廠提供了一種方法來爲正在創建的物品本地化創建邏輯。

public interface IParser<T> 
{ 
    T Parse<T>(string item); 
} 

public class KeyValueParser : IParser<KeyValue> 
{ 
    KeyValuePair Parse<KeyValue>(string item); 
} 

... 

public class ParserFactory 
{ 
    public IParser<T> CreateParser<T>() 
    { 
     var type = typeof(T); 
     if (type == typeof(KeyValuePair)) 
     { 
      return new KeyValueParser(); 
     } 
     ... 
     throw new InvalidOperationException("No matching parser type."); 
    } 
} 

有些人則提出了一個插件模型,如果合適的話,工廠可以用於讀取插件配置,加載相應的插件,並根據需要創建的實例類型。在這種情況下,將工廠視爲「經理」可能更合適,因爲它不僅僅是創建實例。

2

我會說你在正確的軌道上,但你有點不對。你應該去Factory Method和Visitor patern的方向,首先解決解析問題。

  1. 處理不同類型輸入的訪問者。
  2. 訪客被創建的思想工廠方法。
  3. 工廠注入作爲構造函數完成依賴注入模式。

這項工作可能對你有意思 - http://www.exciton.cs.rice.edu/research/sigcse05/dp4rdp.pdf

+0

斷開鏈接.... – hagensoft 2013-08-20 23:28:49

2

你所描述只是遠程連接到依賴注入。然而,它是替換條件與多態性的海報示例Refactoring(第255頁),所以它絕對是一個好主意。

只有當您決定完全免除條件時纔會變成DI,而不是將注入消費者

0

我已經實現了一個使用抽象工廠模式的文件解析器。 而我的工廠只是要求文件擴展名,並基於使用策略(或切換案例)我決定實例化哪個解析器。