Dagger:是否可以自动将 Subcomponent getter 公开给同级 Subcomponents 作用域?
Dagger: Is it possible to automatically expose Subcomponent getters to a sibling Subcomponent's scope?
我有一个根组件和两个同级子组件(我们称它们为 Root
、A
、B
)。子组件通常需要彼此隔离。
但是,A
确实公开了一些 B
需要访问的 API。今天,我们这样做:
Root rootComponent = buildRootComponent();
A aComponent = rootComponent.getAComponentBuilder().build();
B bComponent = rootComponent.getBComponentBuilder()
.bindX(aComponent.getX())
.bindY(aComponent.getY())
.bindZ(aComponent.getZ())
// etc...
.build();
这使 B 可以访问 A 的特定 API,而无需访问 所有内容。这太棒了。
不过,这也是很多繁琐的开销。每当我们要从A传递一个新的东西给B时,我们需要在三个地方添加代码:
- 在
B
中写一个getter:
@B
Q getQ();
- 在
A
的生成器中编写活页夹:
@BindsInstance
Builder setQ(Q q);
- 编写将两者联系在一起的胶水代码(如上所述):
B bComponent = rootComponent.getBComponentBuilder()
//...
.setQ(bComponent.getQ())
.build();
我想跳过第 2 步和第 3 步。我希望 B
上所有已定义的 getter 自动绑定到 A
内,而不暴露 [=15] 的其余部分=] 到 B
。这可能吗?
是的,通过指定您为 BComponent 定义的 component dependency, you can effectively have every "provision method" (zero-arg getter) on the target component added as a delegating provider as you manually wrote it here. You'll have BComponent list AComponent as a dependency, which also means you'll need to provide an instance of AComponent in the Component.Factory or Component.Builder 接口。 (就此而言,如文档中所述,您所依赖的“组件”可以是任何 class 或接口,无论它是否具有 Dagger 注释或是否具有 Dagger 生成的实现。)
注意这种布局:首先,表达 AComponent 和 BComponent 的混合对于未来的读者来说可能很难理解,尤其是因为 AComponent 和 BComponent 共享一个层次结构,并且根据您定义公共组件的位置和方式,其行为可能违反直觉提供商。此外,如果您使用多个小型构建目标,您可能会发现 BComponent.java 直接导入 AComponent 很困难或很昂贵,因为 AComponent 将依赖于 AComponent 的所有接口,并通过其具体的模块列表实现。 (如果您让 BComponent 依赖于您在没有注释的情况下创建的 AComponentInterface,您可以解决这个问题,将您的 getter 放在该接口上,并让 AComponent 扩展 AComponentInterface 以避免重复;这一切都加剧了使您的构建和对象图过于复杂而无法执行的风险明白。)
我有一个根组件和两个同级子组件(我们称它们为 Root
、A
、B
)。子组件通常需要彼此隔离。
但是,A
确实公开了一些 B
需要访问的 API。今天,我们这样做:
Root rootComponent = buildRootComponent();
A aComponent = rootComponent.getAComponentBuilder().build();
B bComponent = rootComponent.getBComponentBuilder()
.bindX(aComponent.getX())
.bindY(aComponent.getY())
.bindZ(aComponent.getZ())
// etc...
.build();
这使 B 可以访问 A 的特定 API,而无需访问 所有内容。这太棒了。
不过,这也是很多繁琐的开销。每当我们要从A传递一个新的东西给B时,我们需要在三个地方添加代码:
- 在
B
中写一个getter:
@B
Q getQ();
- 在
A
的生成器中编写活页夹:
@BindsInstance
Builder setQ(Q q);
- 编写将两者联系在一起的胶水代码(如上所述):
B bComponent = rootComponent.getBComponentBuilder()
//...
.setQ(bComponent.getQ())
.build();
我想跳过第 2 步和第 3 步。我希望 B
上所有已定义的 getter 自动绑定到 A
内,而不暴露 [=15] 的其余部分=] 到 B
。这可能吗?
是的,通过指定您为 BComponent 定义的 component dependency, you can effectively have every "provision method" (zero-arg getter) on the target component added as a delegating provider as you manually wrote it here. You'll have BComponent list AComponent as a dependency, which also means you'll need to provide an instance of AComponent in the Component.Factory or Component.Builder 接口。 (就此而言,如文档中所述,您所依赖的“组件”可以是任何 class 或接口,无论它是否具有 Dagger 注释或是否具有 Dagger 生成的实现。)
注意这种布局:首先,表达 AComponent 和 BComponent 的混合对于未来的读者来说可能很难理解,尤其是因为 AComponent 和 BComponent 共享一个层次结构,并且根据您定义公共组件的位置和方式,其行为可能违反直觉提供商。此外,如果您使用多个小型构建目标,您可能会发现 BComponent.java 直接导入 AComponent 很困难或很昂贵,因为 AComponent 将依赖于 AComponent 的所有接口,并通过其具体的模块列表实现。 (如果您让 BComponent 依赖于您在没有注释的情况下创建的 AComponentInterface,您可以解决这个问题,将您的 getter 放在该接口上,并让 AComponent 扩展 AComponentInterface 以避免重复;这一切都加剧了使您的构建和对象图过于复杂而无法执行的风险明白。)