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)この例では、依存関係が明らかに注入されています。この例では、依存関係の注入を可能にするためだけにインターフェイスも注入されていると言えますか?
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);
}
}
したがって、「依存関係」-ServiceInjector
とService
が配置されているライブラリ-は具体的なクライアントオブジェクトを認識していませんが、ServiceInjector
はService
を挿入できますクライアントへのオブジェクト。
(クライアントオブジェクトをより早く構築する必要があると仮定します。Inject
が呼び出されるかどうかを決定できるようにするために最初に必要になる場合があります。ここでは「コンストラクターインジェクション」は不可能です。)
part4: "..このように、依存関係がインジェクターになる .."-太字の部分はあいまいです。
これは私が上で書いたものに完全に適合します。ここで「依存性」という用語が完全なフレームワーク/ライブラリを指していると考える場合、私が説明した関数はそのような「インジェクター」です。
そして、はい、私は同意します。「依存関係」という用語を少し異なる意味で使用しても、ウィキペディアの記事が読みやすくなるわけではありません。