を実装する型のシーケンスを生成する 2 つのクラスがあります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);
アプリケーションには他の使用パターンがないため、コンストラクター注入を使用して 2 つの型間の関係を明示的にする正しい設計選択でしょうか?
ヘッダー インターフェイスのテストを簡略化するために、次の例に従います(ここを参照) 。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
) がIBar
インスタンスからIFoo
インスタンスに変換することです。両方
SeqProcessorX
の署名が似ていても、強制的に変更しないと自然に連鎖するSeqProcessor1
ことはできません。SeqProcessor2
SeqProcessor2
(IFoo
-> )という同じ署名を持つ他のプロセッサは、IFoo
代わりに連鎖する可能性があります。