我试图理解Dagger 2并且悲惨地失败。
以下是我正在努力工作的代码:
TranslationService依赖于DataService:
// Relies on injected DataService
public class TranslatorService implements ServiceContracts.TranslatorService
{
ServiceContracts.DataService mDataService;
public TranslatorService(ServiceContracts.DataService dataService) {
this.mDataService = dataService;
}
public String translate(String key) {
if (mDataService == null)
return "Default";
return mDataService.getData(key);
}
}
// implements DataService
public class LocalDataService implements ServiceContracts.DataService {
@Override
public String getData(String key) {
return key + " (local)";
}
}
提供两种服务的两个模块:
@Module
public class DataServiceModule {
@Provides
public ServiceContracts.DataService dataService() {
return new LocalDataService();
}
}
@Module
public class TranslatorModule {
@Provides
TranslatorService translatorService(ServiceContracts.DataService dataService) {
return new TranslatorService(dataService);
}
}
一个@Component和一个@Subcomponent(因为TranslationService依赖于DataService:
@Component(modules = {DataServiceModule.class})
public interface DataServiceComponent {
TranslatorComponent translatorComponent(TranslatorModule translatorModule);
}
@Subcomponent(modules = {TranslatorModule.class})
public interface TranslatorComponent {
TranslatorService translatorService();
}
代码构建得很好。但是,当我现在查看子组件生成的Dagger实现时,我得到了这个:
private final class TranslatorComponentImpl implements TranslatorComponent {
private final TranslatorModule translatorModule;
private Provider<TranslatorService> translatorServiceProvider;
private TranslatorComponentImpl(TranslatorModule translatorModule) {
this.translatorModule = Preconditions.checkNotNull(translatorModule);
initialize();
}
@SuppressWarnings("unchecked")
private void initialize() {
this.translatorServiceProvider =
TranslatorModule_TranslatorServiceFactory.create(
translatorModule, DaggerDataServiceComponent.this.dataServiceProvider);
}
@Override
public TranslatorService translatorService() {
return translatorServiceProvider.get();
}
}
所以基本上我不能使用子组件,因为它是私有的。我如何获得TranslatorService的实际实例?
我真诚地希望有人可以帮助我 - 我现在想要解决这个问题几个小时,并且要么出现构建错误或私有组件类实现......
答案 0 :(得分:1)
您不应手动触摸dagger模块实施。
让我们说你想注入一个名为A的类。
向您的子组件添加名为void inject(A a);
的方法。
然后在A类中调用
DaggerDataServiceComponent.builder()
.build()
.translatorComponent(new TranslatorModule())
.inject(this);
如果您的Dagger模块提供该字段的类型,它将注入一个用@Inject
注释的字段。
这会让你了解Dagger。当你理解这一点时,为你的组件实现逻辑,因为在我的例子中,子组件是没有意义的,因为每次都创建两个组件。