Dagger2在几个gradle模块中拆分应用程序

时间:2017-04-04 11:59:31

标签: java android dagger-2

我有以下匕首组件结构:

@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个模块AB取决于核心,但彼此不了解。

我的问题是CoreComponent使用AB的导入来创建子组件。因此Core取决于AB

我试图使用@Components.Builder来解决它,但这也需要在根组件中使用带有一组所有子组件的dagger模块。

是否有任何方法可以删除根组件对其子组件的依赖性。

依赖于根组件,我的意思是它应该知道使用它的所有子组件。

根据匕首文件:

  

子组件是继承和扩展对象图的组件   父组件的。你可以用它们来划分你的   应用程序的对象图到子图中封装   您的应用程序的不同部分彼此或使用更多   组件中的一个范围。

     

子组件中绑定的对象可以依赖于任何对象   另外,绑定在其父组件或任何祖先组件中   到绑定在自己的模块中的对象。另一方面,   父组件中绑定的对象不能依赖于绑定的对象   子;也不能绑定在一个子组件中的对象   绑定在兄弟子组件中的对象。

1 个答案:

答案 0 :(得分:2)

您无法使用子组件删除依赖项CoreComponent -> ComponentA, ComponentB。这不是子组件的工作方式。

您可以尝试通过使ComponentAComponentB依赖于CoreComponentComponentA, ComponentB -> CoreComponent)来扭转此依赖关系。这将要求您在CoreComponent

中显式导出对象

作为旁注,我必须警告你,你将要做的事情将来可能会引起很大的麻烦:通过第三方框架耦合模块的内部实现很少是一个好主意。