Dagger 2最基本的子组件样本无效

时间:2017-10-22 18:06:19

标签: java dagger-2

我试图理解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的实际实例?

我真诚地希望有人可以帮助我 - 我现在想要解决这个问题几个小时,并且要么出现构建错误或私有组件类实现......

1 个答案:

答案 0 :(得分:1)

您不应手动触摸dagger模块实施。 让我们说你想注入一个名为A的类。 向您的子组件添加名为void inject(A a);的方法。

然后在A类中调用

DaggerDataServiceComponent.builder() .build() .translatorComponent(new TranslatorModule()) .inject(this);

如果您的Dagger模块提供该字段的类型,它将注入一个用@Inject注释的字段。

这会让你了解Dagger。当你理解这一点时,为你的组件实现逻辑,因为在我的例子中,子组件是没有意义的,因为每次都创建两个组件。