どちらのパターンも、制御の反転の原則の実装のように見えます。つまり、オブジェクトは依存関係の構築方法を知らないはずです。
Dependency Injection(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>();
}
//...
}
私たちの依存関係は単なるオブジェクトそのものなので、これらの依存関係には依存関係があり、さらに多くの依存関係があり、以下同様です。このようにして、Inversion of Control Container(またはDI Container)が誕生しました。例:Castle Windsor、Ninject、Structure Map、Springなど)
ただし、IOC / DIコンテナはサービスロケータとまったく同じように見えます。それをDIコンテナーと呼ぶのは悪い名前ですか?IOC / DIコンテナは別のタイプのサービスロケータですか?多くの依存関係がある場合にDIコンテナーを使用するという事実のニュアンスはありますか?