2013-07-22 56 views
1

我有一個spec translator,如下所示。方法參數(依賴注入)的數據封裝考慮

//all specifications implement this base class 
    public abstract class SpecBase 
     { 
      public abstract void Translate(IContext context);  
     } 

//spec translator implementation 
     public interface ISpecTranslator 
     { 
      void Translate(IContext context); 
     } 

我需要注入SpecTranslator構造函數的依賴關係。我有兩種方式來表達依賴性。

解決方案1 ​​

public class SpecTranslator:ISpecTranslator 
    { 
     IList<SpecBase> specs; 

     public SpecTranslator(IList<SpecBase> specs) 
     {  
       this.specs = specs; 
     } 

    } 

請注意,使用IList<SpecBase>作品了,但似乎解決方案2提供了更多的保護。

解決方案2:

public class SpecTranslator:ISpecTranslator 
    { 
     ISpec spec; 
     public SpecTranslator(ISpec spec) 
     {  
       this.spec = spec; 
     } 

    } 

    public interface ISpec 
    { 
     IList<SpecBase> specs {get;} 
    } 

但是,使用構造函數依賴注入時的ISpec實施有同樣的問題。

對這兩種解決方案或其他解決方案的利弊有何看法?

回答

0

看來爲了「翻譯」(分析)規格列表,給定的實例的內容需要在所有情況下進行解構。一個清單必須獲得並通過。無論您編織多少層抽象,SpecTranslator最終都需要一個列表。

在你的情況下,我認爲ISpec作爲一個工廠。如果列表不是懶散計算的,那麼它就沒有價值。

另外,簡單是一個重要的設計原則。由於ISpec沒有增加任何功能或架構自由,因此它不承擔其自身的重量。

+0

謝謝。它有助於。我喜歡。 – Pingpong