Java 匕首2最基本的子部件样本不工作
我试图理解匕首2的意义,但失败得很惨 以下是我正在尝试使用的代码: TranslationService依赖于数据服务:Java 匕首2最基本的子部件样本不工作,java,dagger-2,Java,Dagger 2,我试图理解匕首2的意义,但失败得很惨 以下是我正在尝试使用的代码: TranslationService依赖于数据服务: // Relies on injected DataService public class TranslatorService implements ServiceContracts.TranslatorService { ServiceContracts.DataService mDataService; public TranslatorServic
// 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)";
}
}
@Component(modules = {DataServiceModule.class})
public interface DataServiceComponent {
TranslatorComponent translatorComponent(TranslatorModule translatorModule);
}
@Subcomponent(modules = {TranslatorModule.class})
public interface TranslatorComponent {
TranslatorService translatorService();
}
提供两项服务的两个模块:
@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);
}
}
一个@组件和一个@子组件(因为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)";
}
}
@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();
}
}
private final类TranslatorComponentImpl实现TranslatorComponent{
专用最终翻译模块翻译模块;
私人提供者翻译服务提供者;
专用Translator组件TIMPL(Translator模块Translator模块){
this.translatorModule=前提条件.checkNotNull(translatorModule);
初始化();
}
@抑制警告(“未选中”)
私有void初始化(){
此.translator服务提供程序=
TranslatorModule\u TranslatorServiceFactory.create(
translatorModule,DaggerDataServiceComponent.this.dataServiceProvider);
}
@凌驾
公共翻译服务翻译服务(){
return translatorServiceProvider.get();
}
}
所以基本上我不能使用子组件,因为它是私有的。我如何获得TranslatorService的实际实例
我真诚地希望有人能帮我解决这个问题-我现在花了几个小时试图解决这个问题,要么得到构建错误,要么得到私有组件类实现…你不应该手动触摸dagger模块实现。 假设您想要注入一个名为a的类。 将名为
void inject(A);
的方法添加到子组件中
然后在该类中调用
DaggerDataServiceComponent.builder()
.build()
.translatorComponent(新TranslatorModule())
.注入(此);
如果Dagger模块提供了字段类型,则它将注入到带有@inject
注释的字段中
这将让您了解Dagger。当您理解这一点时,将逻辑实现到您的组件中,因为在我的示例中,子组件是毫无意义的,因为两个组件都是每次创建的。我不太确定您在这里试图实现什么,您能将代码发布到注入这些依赖项的位置吗。我并不是真的试图这样做“achive anything”…这更像是在玩基本的示例来真正理解Dagger。我来自C#背景,在C#DI容器中工作有点不同。子组件的整个概念让我有点难以理解。对于一个组件,我通常(从Dagger)得到DaggerTranslatorComponent.build()之类的东西.xxxxx以创建我的注入器。但由于DaggerTranslatorComponent不存在,我被卡住了。我明白了…所以,我只想确认一下:我将使用“DaggerParentComponent.builder().build()”获取(宽范围)父实例的注入器,然后我将使用相同的注入器创建一个或多个“ChildComponent”(新的ChildModule())“一个或多个子实例的喷油器(范围较窄)?或者我会对所有不同的子实例始终使用相同的ChildInjector吗?这取决于。子组件的生命周期设计为与其父组件具有更小或相等的生命周期。您没有使用作用域来管理对象生命周期,因此创建新的子组件将毫无意义。但是,一旦您将作用域添加到子组件的从属组件中例如,您可以根据组件管理对象创建。例如,您可以在TranslatorModule()中将@SomeScope添加到依赖项中在TranslatorComponent类中,它将TranslatorService生命周期绑定到子组件生命周期。当您创建子组件的新实例时,将创建TranslatorService的新实例。非常感谢!它现在可以工作(即使使用范围),并且最终对我有意义。