来自匕首讨论@:
我有一个类,它从对象图中获取一些依赖关系,并在运行时从调用者那里获取其他依赖关系。
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()
方法。
如您所见,这非常冗长且冗长。它也有一堆重复和样板。用 注释字段本身存在一些障碍@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
,如果有的话?
* - “不知何故”确实暗示它对我来说是部分魔法。