寻找匕首辅助注射的例子
我有一个类,它从对象图中获取一些依赖项,并在运行时从调用方获取其他依赖项。
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);
}
}
...
}
(再次,从匕首discuss@)。
My 是由一个类注入的类,该类由另一个类注入,该类由另一个类注入,...,该类在 .这一切都以某种方式*工作,并且所有类都在构建时找到。现在,要添加一个模块,我必须明确地让对象图知道它。ImageDownloader
@Module
我一定错过了一些东西 - 注入一个新类非常容易,但添加一个新模块非常繁琐。
我的问题是:辅助注射在实践中是如何进行的?有人有例子吗?我应该如何使用 ,如果有的话?ImageModule
* - “不知何故”确实暗示它对我来说部分是魔术。