2013-03-17 52 views
1

我有兩個類,它們產生實現IFoo的類型序列。構造函數注入,正確地耦合兩個類,在序列上運行

interface IBar {} // the starting type 
interface IFoo {} // this can undergo various transformations 

class SeqProcessor1 { 
    IEnumerable<IFoo> Process(IEnumerable<IBar> input1) { 
    //... 
    } 
} 

class SeqProcessor2 { 
    IEnumerable<IFoo> Process(IEnumerable<IFoo> input2) { 
    //... 
    } 
} 

SeqProcessor2轉變的IEnumerable<IFoo>另一個IEnumerable<IFoo>所以在代碼中,你會看到:

var seqProc1 = new SeqProcessor1(); 
var seqOfFoo = seqProc1.Process(seqOfBar); 

var seqProc2 = new SeqProcessor2(); 
var finalSeqOfFoo = seqProc2.Process(seqOfFoo); 

由於在應用程序中沒有其他的使用模式,能是否正確的設計選擇使用構造函數注入來使兩種類型之間的關係顯式化?

遵循一個實例,其中以簡化測試一個插頭接口(見here)從SeqProcessor1提取:

interface ISeqProcessor1 { 
    IEnumerable<IFoo> Process(IEnumerable<IBar> input1); 
} 

class SeqProcessor2 { 

    ISeqProcessor1 proc1; 

    SeqProcessor2(ISeqProcessor1 proc1) { 
    this.proc1 = proc1; 
    } 

    IEnumerable<IFoo> Process(IEnumerable<IBar> seqOfBar) { 
    var input = this.proc1.Process(seqOfBar); 
    // 
    return input; 
    } 
} 

瞭解如何SeqProcessor2::Process被改變爲接受IEnumerable<IBar>需要它的依賴性。

導致這種用法:

var seqProc2 = new SeqProcessor2(new SeqProcessor1()); 
var finalSeqOfFoo = seqProc2.Process(seqOfBar); 

編輯:

  • 這裏的關鍵是,第一處理器(需要IBar一)transfroms IBar實例IFoo實例。

  • 即使兩個SeqProcessorX有類似的簽名SeqProcessor1不能自然SeqProcessor2鏈不強迫改變。

  • 具有相同簽名SeqProcessor2IFooIFoo)的其他處理器可以改爲鏈接。

+0

這看起來像'Decorator'模式的經典案例。 – 2013-03-17 09:44:13

+0

@Davin Tryon,這意味着你選擇使用ctor注入來顯式依賴? – jay 2013-03-17 09:57:10

+1

是的,但我也會爲所有處理器創建一個通用接口「IProcessor」。然後你可以按任意順序鏈接它們。 – 2013-03-17 09:57:56

回答

1

在閱讀您的編輯之後,我會說是的,這是您的用例的有效/合理的結構。您看到我對制定有點小心,因爲可能沒有足夠的信息來全面判斷此事。另一方面,在這裏討論所有的可能性可能是不可能的,這就是爲什麼我添加這個答案,儘管有疑問。

不過,我自 開始添加了這個(肯定的)答案 - 你說這是唯一的使用模式。因此,我們只需要考慮目前的代碼 - 結構使您想要達到的目標非常明確。從閱讀中,我可以直接理解,你需要一個特定的處理器 - 代碼短,操作簡單,無碼重複

爲了使長話短說:是的,我認爲這是一個有效的使用構造函數注入

+0

+1和這個答案,很明顯,沒有完整的上下文很難回覆。我總是試圖抽象一些我的問題,以便詢問並讓其他用戶受益。要完成圖片,我可以引用另一個我的問題(與此相關)(http://stackoverflow.com/questions/15380262/how-to-create-two-sequences-without-relying-on-side-effects)that for此刻缺少一個__標記的回覆。也許它可能會對你有些興趣。 – jay 2013-03-18 11:14:03

+1

那麼,毫無疑問,抽象問題是一個好主意,所以不需要後悔任何東西:)謝謝你的讚賞和鏈接。我也發佈了一個引用問題的答案。 – bigge 2013-03-18 13:25:44

+0

對其他問題感興趣,@ bigge – jay 2013-03-18 15:13:54