web-dev-qa-db-ja.com

インターフェース注入について

Wikipedia からのインターフェース注入の定義を引用する:

インターフェースインジェクションの利点は、依存関係がクライアントを完全に認識できない場合でも、新しいクライアントへの参照を受信し、それを使用して、自己参照をクライアントに送信できることです。このようにして、依存関係はインジェクターになります

そこで言われていることのそれぞれの部分を理解したいと思います。

言及したソースからここに例を挙げましょう:

// Service setter interface.
public interface ServiceSetter {
    public void setService(Service service);
}

// Client class
public class Client implements ServiceSetter {
    // Internal reference to the service used by this client.
    private Service service;

    // Set the service that this client is to use.
    @Override
    public void setService(Service service) {
        this.service = service;
    }
}

次に、見積もりを分割して説明します。

パート1:「依存関係はクライアントをまったく知らない可能性があります。」-かなり理解できる

part2: "..依存関係はクライアントを完全に無視することができますまだ新しいクライアントへの参照を受け取ることができます、そして..を使用して"-太字の部分あいまいです。 Q1)クライアントは依存関係への参照を取得しますが、その逆ではありませんか?

part3:「まだ新しいクライアントへの参照を受信でき、それを使用して、自己参照をクライアントに送信します...」-かなり理解可能

part4: "..このように、依存関係はインジェクターになります.."-太字の部分は不明瞭です。 Q2)依存関係が注入されています。それで、それら自体はどのようにインジェクターになることができますか?

Q3)この例では、依存関係が明らかに注入されています。この例では、依存関係の注入を可能にするためだけにインターフェイスも注入されていると言えますか?

3
Istiaque Ahmed

part2: "..依存関係はクライアントを完全に無視することができますまだ新しいクライアントへの参照を受け取ることができますそして、..を使用します。-太字の部分はあいまいです。 Q1)クライアントは依存関係への参照を取得しますが、その逆ではありませんか?

ここで「依存関係」という用語をServiceクラス自体だけでなく、このクラスが配置されているライブラリまたはフレームワークについても考えてください。さらに、しばらくの間、Serviceオブジェクトは、何らかの理由でClientオブジェクトの構築時に構築できないと仮定します。 「インターフェース注入」は、以前に構築されたクライアントオブジェクトを(ServiceSetter実装として)取得し、Serviceオブジェクトを構築する関数(おそらく何らかのファクトリまたはビルダークラス)をライブラリが提供できるようにしますそして、可能なときにServiceオブジェクトを注入します。

疑似コード:

// assume this class is located in the same framework
// where "Service" lives
public class ServiceInjector
{
     public void Inject(ServiceSetter client)
     {
           // ...
           // maybe some reusable framework logic
           // to derive construction parameters 
           // for new service here
           // ..
           Service service = new Service(/*...*/);
           client.setService(service);
     }
}

したがって、「依存関係」-ServiceInjectorServiceが配置されているライブラリ-は具体的なクライアントオブジェクトを認識していませんが、ServiceInjectorServiceを挿入できますクライアントへのオブジェクト。

(クライアントオブジェクトをより早く構築する必要があると仮定します。Injectが呼び出されるかどうかを決定できるようにするために最初に必要になる場合があります。ここでは「コンストラクターインジェクション」は不可能です。)

part4: "..このように、依存関係がインジェクターになる .."-太字の部分はあいまいです。

これは私が上で書いたものに完全に適合します。ここで「依存性」という用語が完全なフレームワーク/ライブラリを指していると考える場合、私が説明した関数はそのような「インジェクター」です。

そして、はい、私は同意します。「依存関係」という用語を少し異なる意味で使用しても、ウィキペディアの記事が読みやすくなるわけではありません。

3
Doc Brown