From 匕首讨论@ https://groups.google.com/forum/#!topic/dagger-discuss/QgnvmZ-dH9c:
我有一个类,它从对象图中获取一些依赖项,并在运行时从调用者获取其他依赖项。
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;
...
}
我想出了一个解决方案,我定义了一个工厂,
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()
method.
正如您所看到的,这非常冗长。它还包含大量重复内容和样板文件。对字段本身进行注释存在一些障碍@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@)。
My ImageDownloader
是一个由一个类注入的类,该类由另一个类注入,而另一个类又由另一个类注入,...,它在@Module
。这一切都以某种方式*起作用,并且所有类都在构建时找到。现在,要添加模块,我必须显式地让对象图知道它。
我一定错过了一些东西——注入一个新类很容易,但添加一个新模块却很乏味。
我的问题是:辅助注射在实践中是如何进行的?有人有例子吗?我应该如何使用ImageModule
,如果有的话?
* - “不知怎的”确实意味着它对我来说有一定的魔力。