Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匕首2最基本的子部件样本不工作_Java_Dagger 2 - Fatal编程技术网

Java 匕首2最基本的子部件样本不工作

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

我试图理解匕首2的意义,但失败得很惨

以下是我正在尝试使用的代码:

TranslationService依赖于数据服务:

// 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的新实例。非常感谢!它现在可以工作(即使使用范围),并且最终对我有意义。