web-dev-qa-db-ja.com

DIコンテナとは何ですか?

依存性注入に関するこのコースのビデオを見ています。インストラクターはdi-containerしかし詳細には説明していませんでしたが、今ではいくつかの記事を読んでおり、これが正しいことを確認したいと思います。以下は簡単なプログラムで、私の質問は

以下のプログラムクラスは、最も単純なdi-containerのようなものですか?そうでない場合、単純なdi-containerはどのようになりますか

interface  Implementable {
    void doSmth();
}

class A implements Implementable {

    @Override
    public void doSmth() {

    }
}

class B {

    private Implementable i;

    public B(Implementable implementable) {
        this.i= implementable;
    }

    public void doSmth(){
        i.doSmth();
    }
}

このクラスは2つのコンテナですか?

class Program {
    B b = new B(new A());
    b.doSmth();
}
9
Abdurakhmon

Dependency Injection Principles、Practices、and Patterns によると、DIコンテナは次のとおりです。

DI機能を提供し、オブジェクト構成に関係する多くのタスクの自動化を可能にするソフトウェアライブラリインターセプト、およびライフタイム管理DIコンテナーは、Inversion of Control(IoC)コンテナーとも呼ばれます。(§3.2.2)

少なくとも、DIコンテナーは自動配線を許可します。

Abstractionsと具象型の間のマップからオブジェクトグラフを自動的に構成する機能。コンパイラと共通言語ランタイム。(§12.1.2)

これは通常、DIコンテナーが型のコンストラクターを分析し、各コンストラクター引数を手動で指定する必要なく、依存関係をそのコンテナーに挿入することを意味します。

その観点から、ProgramクラスはnotDIコンテナーです。 ProgramCompositoin Root として機能します。

a(できれば)モジュールが一緒に構成されているアプリケーション内の一意の場所(§4.1)

特定のコンポジションルートでは、 Pure DI を練習しています。これは、DIコンテナを使用するのではなく、言語のnewキーワードを使用してオブジェクトグラフを手動で作成する練習です。

6
Steven