依存性注入パターンとサービスロケータパターンの違いは何ですか? 質問する

依存性注入パターンとサービスロケータパターンの違いは何ですか? 質問する

どちらのパターンも、制御の反転の原則の実装のように見えます。つまり、オブジェクトは依存関係の構築方法を認識してはならないということです。

依存性注入 (DI) は、コンストラクターまたはセッターを使用して依存性を「注入」するようです。

コンストラクターインジェクションの使用例:

//Foo Needs an IBar
public class Foo
{
  private IBar bar;

  public Foo(IBar bar)
  {
    this.bar = bar;
  }

  //...
}

Service Locator は、依存関係を接続して foo にバーを与える「コンテナー」を使用しているようです。

サービスロケーターの使用例:

//Foo Needs an IBar
public class Foo
{
  private IBar bar;

  public Foo()
  {
    this.bar = Container.Get<IBar>();
  }

  //...
}

依存関係はそれ自体が単なるオブジェクトであるため、これらの依存関係には依存関係があり、その依存関係にもさらに多くの依存関係があり、というように続きます。このようにして、制御の反転コンテナー (または DI コンテナー) が誕生しました。例: Castle Windsor、Ninject、Structure Map、Spring など)。

しかし、IOC/DI コンテナーはサービス ロケーターとまったく同じように見えます。これを DI コンテナーと呼ぶのは不適切な名前でしょうか? IOC/DI コンテナーは、サービス ロケーターの別のタイプにすぎないのでしょうか? DI コンテナーは、依存関係が多数ある場合に主に使用されるというニュアンスの違いがあるのでしょうか?

ベストアンサー1

違いはわずかであるように思えるかもしれませんが、ServiceLocator を使用した場合でも、クラスは依然依存関係を作成する責任があります。依存関係を作成するためにサービス ロケーターを使用するだけです。DI では、クラスに依存関係が与えられます。依存関係がどこから来るのかはクラスにはわかりませんし、気にもしません。この重要な結果の 1 つは、DI の例の方がユニット テストがはるかに簡単であることです。依存オブジェクトのモック実装を渡すことができるためです。必要に応じて、この 2 つを組み合わせて、サービス ロケーター (またはファクトリー) を挿入することもできます。

おすすめ記事