3

注入する必要がある依存関係が 10 個あり、コンストラクターに 10 個のパラメーターを入れたくない場合、どの注入パターンを使用すればよいですか?

public class SomeClass
{
    private IDependency1 _dependency1;
    private IDependency2 _dependency2;
    private IDependency3 _dependency3;
    //...
}

セッターメソッドインジェクションを使用する必要がありますか?

public class SomeClass
{
    private IDependency1 _dependency1;
    private IDependency2 _dependency2;
    private IDependency3 _dependency3;
    //...

    [Inject]
    public void SetDependency1(IDependency1 dependency1)
    {
        _dependency1 = dependency1;
    }
    //...
}

それともプロパティ注入?

public class SomeClass
{
    [Inject]
    public IDependency1 Dependency1 { private get; set; }
    [Inject]
    public IDependency2 Dependency2 { private get; set; }
    [Inject]
    public IDependency3 Dependency3 { private get; set; }
    //...
}

Ninject wiki によると、上記のようなプロパティのみを書き込むことは悪い習慣と見なされますが、コードが少ないだけで、上記のセッター メソッド インジェクションと同じではありませんか?

このシナリオでは、どのパターンが最も理にかなっていますか?

4

1 に答える 1

9

コンストラクター注入は、常に依存性注入を行うための推奨される方法です。たとえば、依存関係の循環 (A が B に依存し、B が A に依存する場合) を処理する場合など、コンストラクターの注入が不可能な場合にのみ、プロパティの注入に戻る必要があります。

あなたがおそらくこの質問をする理由は、あなたが書いて、多くの引数でコンストラクターを維持することに不快感を覚えるからです。

多くの引数を持つことはアンチパターン (コンストラクターのオーバーインジェクション アンチパターン) ですが、これを回避する方法は、プロパティ インジェクションにフォールバックしないことです。一般に、多くの依存関係がある場合、問題のクラスは多くのことを行います。単一責任の原則に違反します。厄介な数の依存関係を持つことは、実際には、SRP に違反した場合の問題を最小限に抑えることができます。SRP に違反するコードは、理解、保守、およびテストがより困難になります。経験から話せます。クラスの単体テストを書くことに違和感を覚えるたびに、自分の設計に何か問題がありました。SRP 以外にも、SOLIDにグループ化された 4 つの重要な原則があります。頭字語。これらの原則に従えば、より保守しやすいソフトウェアを使用して、より幸せなプログラマーになることができます。

クラスが SRP に違反する場合、一般に、これは、それぞれが単一の責任を持つ複数のクラスに分割する必要があることを意味します。これを行うと、依存関係の数が減少することがわかります。

于 2012-09-18T11:58:30.533 に答える