1

を実装する型のシーケンスを生成する 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) {
    //...
  }
}

SeqProcessor2IEnumerable<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代わりに連鎖する可能性があります。

4

1 に答える 1

1

あなたの編集を読んだ後、はい、これはあなたのユースケースにとって有効で合理的な構造です。問題を完全に判断するのに十分な情報がない可能性があるため、私が定式化に少し注意を払っているように見えます. 一方で、ここですべての可能性について議論することはおそらく不可能であるため、疑問にもかかわらずこれを回答として追加しました。

それにもかかわらず、私はこの(肯定的な)回答を追加しました-これが唯一の使用パターンであるとあなたは述べています。したがって、現在のコードのみを考慮する必要があります。構造により、達成したいことの意図が非常に明確になります。読んだところ、特定のプロセッサが必要であることを直接理解できます-コードは短く、シンプルで、コードの重複はありません

簡単に言うと、はい、これはコンストラクター注入の有効な使用法だと思います

于 2013-03-18T08:45:34.393 に答える