Dagger在我的情况下在模块中声明子组件

问题描述 投票:1回答:1

我正在使用Dagger 2.24版

关于带有子组件的此模块声明:

@Module(subcomponents = MySubComponent.class)
abstract class MyModule {
  ...
}

我理解(如果我在这里已经理解错了,请指出)此代码意味着MyModule下的类属于MySubComponent

某些教程说,

此代码可以使Dagger自动检测是否请求子组件。

是什么意思?这是否意味着在编译时Dagger可以通过扫描代码库来确定是否请求此子组件,以查看此模块中的任何对象是否受任何代码依赖,如果不存在,则在编译时不会生成MySubComponent(及其包含的对象)时间?否则Dagger然后会生成MySubComponent(&属于它的对象)?

我理解正确还是错过了什么?

android dependency-injection dagger-2
1个回答
0
投票

这是否意味着在编译时Dagger可以决定是否扫描代码库请求子组件以查看是否有任何对象该模块中的代码取决于任何代码,如果没有,则不会MySubComponent(及其包含的对象)在编译时生成时间?否则Dagger然后将生成MySubComponent(&对象属于它)?

[我认为您混合了code generationobject instantiated。该代码总是生成的(即MySubComponent总是由Dagger生成),但是天气instantiated是基于MyModule创建的对象是否需要它。

如果MyModule提供MySubComponent的构建器所需的对象,则仅当创建该对象时,MySubComponent的构建器为instantiated,如https://dagger.dev/subcomponents.html中的示例所示>]

@Singleton
class RequestRouter {
  @Inject RequestRouter(
      Provider<RequestComponent.Builder> requestComponentProvider) {}

  void dataReceived(Data data) {
    RequestComponent requestComponent =
        requestComponentProvider.get()
            .data(data)
            .build();
    requestComponent.requestHandler()
        .writeResponse(200, "hello, world");
  }
}

[创建RequestRouter时,将给出Provider<RequestComponent.Builder> requestComponentProvider。并且仅在调用dataReceived函数时,才创建子组件生成器(即RequestComponent的生成器),然后创建子组件(即RequestComponent)。

[具有@Module(subcomponents = MySubComponent.class)允许延迟创建其子组件,因此在下面进行说明

此代码可以使Dagger自动检测是否请求子组件。

以上陈述是为了与如下所述的instantiating MySubComponent的另一种方法形成对比

另一种方法是,强制子组件(或其构建器)始终为instantiated,这是通过ParentComponent创建的。

@Component
interface MyParentComponent {
    MySubComponent getSubComponent();
}

您可以参考https://medium.com/@elye.project/dagger-2-subcomponent-through-module-or-component-comparison-92486767a861文章以了解两者之间的更多详细信息。

希望这可以澄清。

© www.soinside.com 2019 - 2024. All rights reserved.