オブジェクトグラフからいくつかの依存関係を取得し、実行時に呼び出し元から他の依存関係を取得するクラスがあります。
public class ImageDownloader {
// Get these dependencies from the injector.
private final HttpClient httpClient;
private final ExecutorService executorService;
// Get these from the caller.
private final URL imageUrl;
private final ImageCallback callback;
...
}
Factory を定義する解決策を思いつきました。
public class ImageDownloader {
...
public static class Factory {
private final HttpClient httpClient;
private final ExecutorService executorService;
@Inject
public Factory(HttpClient httpClient, ExecutorService executorService) {
this.httpclient = httpClient;
this.executorService = executorService;
}
public ImageDownloader create(URL imageUrl, ImageCallback callback) {
return new ImageDownloader(httpClient, executorService, iamgeUrl, callback);
}
}
...
}
ImageDownloader
ここで、クライアントのコンストラクターに注入する代わりに、単純にそのメソッドを注入ImageDownloader.Factory
して呼び出します。create()
ご覧のとおり、これは非常に冗長で長いものです。また、複製とボイラープレートがたくさんあります。フィールド自体に で注釈を付けるにはいくつかの障害がある@Inject
ため、現時点ではこの可能性を無視しましょう。
Square の人々は、プロバイダーを使用して興味深い解決策を思いつきました。Factory
インターフェイスを定義し、
public class ImageDownloader {
...
public interface Factory {
ImageDownloader create(URL imageUrl, ImageCallback callback);
}
}
モジュールで提供し、
public class ImageModule {
...
@Provides
public ImageModule.Factory provideImageModuleFactory(
final Provider<HttpClient> httpClientProvider,
final Provider<ExecutorService> executorServiceProvider) {
return new ImageDownloader.Factory() {
public ImageDownloader create(URL imageUrl, ImageCallback callback) {
return new ImageDownloader(httpClientProvider.get(), executorServiceProvider.get(),
imageUrl, callback);
}
}
...
}
(再び、dagger-discuss@ から)。
MyImageDownloader
は、別のクラスによって注入されるクラスによって注入されるクラスであり、さらに別のクラスによって注入されるクラスであり、 ... で参照されます@Module
。これは何とか*機能し、すべてのクラスはビルド時に見つかります。さて、モジュールを追加するには、オブジェクト グラフにそれを明示的に知らせる必要があります。
新しいクラスを注入するのは非常に簡単ですが、新しいモジュールを追加するのは非常に面倒です。
私の質問は次のとおりです。補助注射は実際にどのように行われますか? 誰にも例がありますか?使用する場合、どのように使用ImageModule
すればよいですか?
* - 「どういうわけか」というのは、それが私にとって部分的に魔法であることを意味します。