我有兩個類,它們產生實現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
一)transfromsIBar
實例IFoo
實例。即使兩個
SeqProcessorX
有類似的簽名SeqProcessor1
不能自然與SeqProcessor2
鏈不強迫改變。具有相同簽名
SeqProcessor2
(IFoo
→IFoo
)的其他處理器可以改爲鏈接。
這看起來像'Decorator'模式的經典案例。 – 2013-03-17 09:44:13
@Davin Tryon,這意味着你選擇使用ctor注入來顯式依賴? – jay 2013-03-17 09:57:10
是的,但我也會爲所有處理器創建一個通用接口「IProcessor」。然後你可以按任意順序鏈接它們。 – 2013-03-17 09:57:56