12

私はしばらくの間プログラミングを行ってきましたが、それぞれの概念が何を意味するのかを理論的に知ることに興味はありませんでした.さまざまなプログラミング概念を使用しているかもしれませんが、それを知りません.

Service Locator : 私にとっては、コード量を減らして開発をスピードアップするためのショートカットの記録を指します。1 つの質問は、ロケーターが名前空間/クラスのみを参照できるか、それとも変数のレジストリを持つことができるかということです。

これが私の理解です:

$locator = new ServiceLocator()
$locator->set('app', new System\Application());
$locator->set('db', new System\Pdo());

// Get the objects
$locator->get('db')->connect();
$locator->get('app')->run();

依存性注入 (および依存性注入コンテナー) : オブジェクト内にオブジェクトを注入し、ファクトリ パターンに関係なく、これらへのアクセスを高速化します。そしてDIコンテナ?

これが私の理解です:

$app = new System\Application(System\Config::load());

制御の反転: このデザイン パターンを理解していない (または、理解しているが、IoC を行っているかどうかがわからない)

それでは、理論的に (できれば簡単な例を使用して)、これらの概念のそれぞれは何を意味するのでしょうか? 私は正しいですか、または何が間違っていますか/改善できますか?

ありがとう!

4

2 に答える 2

20

サービスの場所と依存関係の注入は、最初はクラスを分離して、簡単にテストして変更できるようにするためのものです。

IoC コンテナーの登録部分と解決部分をサービスロケーターと比較すると、同じように見えます。

IoC コンテナーをサービス ロケーターとして使用できますが、これはアンチ パターンと見なされます。Service Location を使用する場合は、常にアーキテクチャ全体で Service Locator をアクティブに呼び出す必要があります。したがって、クラスを分離しますが、一方でそれらすべてを Service Locator に結合します。さらに、依存関係を隠しているため、Service Locator では依存関係の検出がより困難になります。一方、依存性注入では、コンストラクター注入を使用して依存性を「公開」します。

IoC コンテナーを使用する場合は、依存関係の挿入 (コンストラクターの挿入またはプロパティの挿入) を使用します。IoC コンテナーは、コンストラクターのパラメーターを参照して依存関係グラフを解決し、依存関係グラフ全体を作成できるようになりました。これを自動配線と呼びます。Service Locator は依存関係を自動配線できません。すでに述べたように、自動配線を使用する必要はありません。各クラスで IoC コンテナーを直接呼び出すだけで、IoC コンテナーをサービス ロケーターのように簡単に使用できますが、そうすべきではありません

参照: https://stackoverflow.com/a/11319026/175399

ここに画像の説明を入力

于 2012-04-07T09:45:59.120 に答える
10

Service Locator について正しく理解できたと思います。

Dependency Injectionについては、オブジェクトがコンストラクターやプロパティの依存関係を持っている場合、オブジェクトがそれ自体で依存関係を取得するのではなく、これらが外部からオブジェクトに注入されることを意味します。

public class MyClass
{
   private $_dep;
   public function __construct($dep=null)
   {
       //$dep has to be injected
       $this->_dep=$dep;                           
   }

   //this is wrong because it couples MyClass to a specific Dependency implementation
   public function __construct()
   {
       $this->_dep=new Dependency();
    }
}
   $dep=new Dependency();
   $obj=new MyClass($dep);

通常、コンストラクターはパラメーターとして抽象化 (インターフェイス) を受け取り、クラスの外側で具体的な実装がインスタンス化され、MyClass の新しいインスタンスを作成するときにコンストラクターに渡されます。

DI コンテナーは、依存関係の挿入を自動的に処理します。抽象化が要求されたときに返される具象クラスを認識できるように、構成するだけです。Container はオブジェクトの作成を処理し、コンストラクターやプロパティを介して依存関係を注入します。コンテナーによっては (php の例を知りません。.net DI コンテナーしか知りません)、作成できるオブジェクトの種類も登録する必要がある場合があります。

制御の反転とは、下位レベルのクラス (依存関係) の実装に依存する上位レベルのクラスではなく、下位レベルのクラスの実装が上位レベルのクラスによって必要とされる抽象化に依存するように、制御が反転されることを意味します。

//abstraction defined for the use of higher level class
public interface  IRepository {}

// that's the dependency, the lower level class  
public class XmlRepository implements IRepository {}

//the higher level class
 public class MyClass
 {
     public function __construct(IRepository $repo) {}
  }

DI コンテナーが IoC 機能を提供するため、IoC と DiC は連携します。

于 2012-04-07T07:53:27.253 に答える