どちらのパターンも、制御の反転の原則の実装のように見えます。つまり、オブジェクトはその依存関係を構築する方法を知っているべきではありません。
依存性注入 (DI) は、コンストラクターまたはセッターを使用して依存関係を「注入」しているようです。
コンストラクター インジェクションの使用例:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Service Locator は「コンテナ」を使用しているようで、依存関係を結び付けて foo にバーを与えます。
Service Locator の使用例:
//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 コンテナーを使用するというニュアンスはありますか?