Dagger 2 - 子组件之间的依赖关系

Dagger 2 - Dependency between SubComponents

我正在做一个有多个范围的 Android 项目,所以我组织了这样的事情:

@Scope
public @interface @ScopeA {}

public class ElementA {
    @Inject
    DependencyAa dependencyAa;
}

@Module
public class ElementAModule {
    private ElementA elementA;

    public ElementAModule(ElementA elementA){
        this.elementA = elementA;
    }

    @ScopeA
    @Provides
    public ElementA providesElementA(){
        return this.elementA;
    }
}

public class ElementB {
    @Inject
    DependencyB dependencyB;
}

@Module
public class ElementBModule { 
    private ElementB elementB;

    public ElementBModule(ElementB elementB){
        this.elementB = elementB;
    }

    @ScopeA
    @Provides
    public ElementB providesElementB(){
        return this.elementB;
    }
}

长话短说,我有几个元素(A,B),每个元素都有一个依赖项(A,B 分别),它们被注入。所以我的问题是,这种依赖关系的最佳方法是什么?

每个元素的一个子组件,包括所有依赖项的通用模块。

@Module
public class DependenciesModule {

   @ScopeA
   @Provides
   public DependencyAa providesDependencyAa(){
        // return DependencyAa
   }

   @ScopeA
   @Provides
   public DependencyB providesDependencyAb(){
        // return DependencyB
   }

}

@ScopeA
@Subcomponent(modules = { ElementAModule.class , DependenciesModule.class })
public interface ElementASubcomponent {
    void inject(ElementA elementA);
}

@ScopeA
@Subcomponent(modules = {ElementBModule.class , DependenciesModule.class})
public interface ElementBSubcomponent {
    void inject(ElementB elementB);
}

一个通用的元素子组件,它依赖于一个通用的依赖模块。这将如何与自定义范围一起使用?

@ScopeA
@Subcomponent(modules = {ElementAModule.class , 
    ElementBModule.class , DependenciesModule.class}){

    void inject(ElementA elementA);
    void inject(ElementB elementB);

}

每个Element一个子组件,仅依赖于一个ElementXModule,其中提供了相应的依赖

@Module
public class ElementAModule {
    private ElementA elementA;

    public ElementAModule(ElementA elementA){
        this.elementA = elementA;
    }

    @ScopeA
    @Provides
    public ElementA providesElementA(){
        return this.elementA;
    }

    @ScopeA
    @Provides
    public DependencyAa providesDependencyAa(){
        // return DependencyAa
    }
}

还有其他建议吗?

提前致谢

这里似乎有 2 个问题:如何组织模块以及如何使用作用域。

如何组织 Module 的实例将取决于依赖关系如何相关(如果它们确实相关的话)。此处提供的信息可能不足以准确确定,但您可以问问自己:

DependencyADependencyB 是否有可能一起用于构造任何 Element,比如说 ElementC?如果没有,它们可能应该在单独的模块中。当然,除非您希望将用例的某种相似性组合成一个逻辑整体。例如,您可能希望将所有与持久性相关的依赖项集中在一个模块中。

关于你的第二个问题,当你使用子组件向下移动对象图时,你只能从更宽的范围移动到更窄的范围。因此,在顶部组件中,您可能拥有应用程序的单例。然后在范围较窄的子组件中,可能是 activity 的依赖项。 "Sibling" 作用域组件不能相互访问成员,但可以访问父组件公开的成员。

可以找到 Android 使用范围的项目的一个很好的例子 here。 在这种情况下,他们按用例将依赖项分组到模块中。