我有以下匕首组件结构:
@Singleton @Component(modules = CoreModule.class)
public interface CoreComponent{
ComponentA plus(ModuleA module);
ComponentB plus(ModuleB module);
}
@ActivityScope @Subcomponent(modules = ModuleA.class)
public interface ComponentA {
ComponentA inject(FragmentA fragment);
}
@ActivityScope @Subcomponent(modules = ModuleB.class)
public interface ComponentA {
ComponentB inject(FragmentB fragment);
}
客户端代码如下所示:
class FragmentA extends Fragment{
public FragmentA(){
App.getCoreComponent().plus(new ModuleA()).inject(this);
}
}
我决定将应用程序拆分为几个gradle模块。
我希望gradle Core
模块和2个模块A
和B
取决于核心,但彼此不了解。
我的问题是CoreComponent
使用A
和B
的导入来创建子组件。因此Core
取决于A
和B
。
我试图使用@Components.Builder
来解决它,但这也需要在根组件中使用带有一组所有子组件的dagger模块。
是否有任何方法可以删除根组件对其子组件的依赖性。
依赖于根组件,我的意思是它应该知道使用它的所有子组件。
根据匕首文件:
子组件是继承和扩展对象图的组件 父组件的。你可以用它们来划分你的 应用程序的对象图到子图中封装 您的应用程序的不同部分彼此或使用更多 组件中的一个范围。
子组件中绑定的对象可以依赖于任何对象 另外,绑定在其父组件或任何祖先组件中 到绑定在自己的模块中的对象。另一方面, 父组件中绑定的对象不能依赖于绑定的对象 子;也不能绑定在一个子组件中的对象 绑定在兄弟子组件中的对象。
答案 0 :(得分:2)
您无法使用子组件删除依赖项CoreComponent -> ComponentA, ComponentB
。这不是子组件的工作方式。
您可以尝试通过使ComponentA
和ComponentB
依赖于CoreComponent
(ComponentA, ComponentB -> CoreComponent
)来扭转此依赖关系。这将要求您在CoreComponent
。
作为旁注,我必须警告你,你将要做的事情将来可能会引起很大的麻烦:通过第三方框架耦合模块的内部实现很少是一个好主意。