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

时间:2016-10-26 06:13:57

标签: java android dependency-injection dagger-2

我正在开发一个包含多个范围的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);
}

一个通用的Element子组件,它依赖于一般依赖项模块。如何使用自定义范围?

@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
    }
}

还欢迎任何其他建议吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

这里似乎有两个问题:如何组织模块以及如何使用范围。

如何组织Module的实例将取决于依赖关系如何相关,实际上它们是相关的。这里可能没有足够的信息来确定,但你可以问自己:

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

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

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