0

これらの概念を調べて、正しく理解しているかどうかを確認したいと思います。主に、これら 3 つの概念を区別しようとしています。ここでのグーグルやその他の結果から、人々が提供した多くの詳細を見ましたが、それらの多くは完全に明確ではないか、矛盾しているか、概念 (IoC/DI) を交換しています。私はそれらをより簡単に消化できるように定義しようとしていますが、それが十分に正確かどうかを確認したいと考えています。

コントロールの反転

クライアント クラスは、依存フィールドの実装クラスを直接インスタンス化することはありません。これは、それらを提供する他の外部クラス/ソースに依存しているためです。ほとんどの場合、フィールドは、実装として提供される 1 つ以上のサブクラスを持つ親クラスまたはインターフェイスです。

依存性注入

クライアント クラスは、コンストラクター、セッターなどを介して、依存フィールドの実装クラスを受け取ります。この実装は、新しいオブジェクト インスタンスです。提供するクラスは、ファクトリなどの別のパターンを使用して、クライアントに渡す実装を決定する場合があります (または、新しいインスタンスを直接インスタンス化してクライアントのコンストラクターに渡す場合もあります)。

サービスロケーター

クライアント クラスは、サービス ロケータを呼び出して依存フィールドを提供するクラスです。返される実装は、同じ依存関係に依存する他のクライアント クラスと共有できるオブジェクト インスタンスです。

非常に単純な例での私の試み:

ディ:

public interface IX {

}

public class X : IX {

}

public class A {
    IX depField;

    public A(IX depField) {
        this.depField = depField;
    }   
}

public void main() {
    A myClass = new A(new X());
}

SL:

public interface IX {

}

public class X : IX {

}

public class A {
    IX depField = serviceLocatorObj.GetService<IX>(); 
    //where IX is mapped to X in the service locator class
}

public void main() {
    A myClass = new A();
}

IoC は受信側の概念であり、DI と SL は供給側の概念を処理する 2 つの可能な方法です。

ありがとう。また、用語の使い方に誤りがありましたら、お詫び申し上げます。

編集:回答ありがとうございます!

4

2 に答える 2

2

はい。それで合っています。

SL は通常、すべてのサービスを検索できるようにするためにフレームワーク内で使用されます。開発者の観点からは、フレームワークがサービスの場所を隠しているため、依存性注入を使用しているだけです。典型的な例は、コントローラーで DI を使用できる ASP.NET MVC です。DependencyResolverASP.NET は、 DI を使用できるようにするために、クラスを通じて内部的にサービスの場所を使用します。

基幹業務アプリケーションの場合、SL よりも DI が優先されます。SL は依存関係を隠し、アプリケーションの保守を難しくするからです。

于 2013-05-07T06:37:23.633 に答える