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
的实例将取决于依赖关系如何相关(如果它们确实相关的话)。此处提供的信息可能不足以准确确定,但您可以问问自己:
DependencyA
和 DependencyB
是否有可能一起用于构造任何 Element
,比如说 ElementC
?如果没有,它们可能应该在单独的模块中。当然,除非您希望将用例的某种相似性组合成一个逻辑整体。例如,您可能希望将所有与持久性相关的依赖项集中在一个模块中。
关于你的第二个问题,当你使用子组件向下移动对象图时,你只能从更宽的范围移动到更窄的范围。因此,在顶部组件中,您可能拥有应用程序的单例。然后在范围较窄的子组件中,可能是 activity 的依赖项。 "Sibling" 作用域组件不能相互访问成员,但可以访问父组件公开的成员。
可以找到 Android 使用范围的项目的一个很好的例子 here。
在这种情况下,他们按用例将依赖项分组到模块中。
我正在做一个有多个范围的 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
的实例将取决于依赖关系如何相关(如果它们确实相关的话)。此处提供的信息可能不足以准确确定,但您可以问问自己:
DependencyA
和 DependencyB
是否有可能一起用于构造任何 Element
,比如说 ElementC
?如果没有,它们可能应该在单独的模块中。当然,除非您希望将用例的某种相似性组合成一个逻辑整体。例如,您可能希望将所有与持久性相关的依赖项集中在一个模块中。
关于你的第二个问题,当你使用子组件向下移动对象图时,你只能从更宽的范围移动到更窄的范围。因此,在顶部组件中,您可能拥有应用程序的单例。然后在范围较窄的子组件中,可能是 activity 的依赖项。 "Sibling" 作用域组件不能相互访问成员,但可以访问父组件公开的成员。
可以找到 Android 使用范围的项目的一个很好的例子 here。 在这种情况下,他们按用例将依赖项分组到模块中。