我正在开发一个包含多个范围的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
}
}
还欢迎任何其他建议吗?
提前致谢
答案 0 :(得分:0)
这里似乎有两个问题:如何组织模块以及如何使用范围。
如何组织Module
的实例将取决于依赖关系如何相关,实际上它们是相关的。这里可能没有足够的信息来确定,但你可以问自己:
DependencyA
和DependencyB
是否有可能一起构建任何Element
,例如ElementC
?如果没有,它们可能应该在单独的模块中。当然,除非您希望在逻辑整体中将用例组合在一起。例如,您可能希望将与持久性相关的所有依赖项组合在一个模块中。
关于第二个问题,当您使用子组件向下移动对象图时,您只能从更宽的范围移动到更窄的范围。因此,在顶级组件中,您可能会为您的应用程序提供单例。然后在具有较窄范围的子组件中,可能是活动的依赖关系。 "同级"作用域组件不能相互访问成员,但可以从父组件访问公开的成员。
可以找到使用范围的Android项目的一个很好的示例here。 在这种情况下,他们通过用例将依赖关系分组到模块中。