Android Dagger-没有no-args构造函数的模块
作者:互联网
如何将没有no-args构造函数的模块组合在一起.我有一个包含多个模块的库,我想在我的应用程序中重用它们.但是,这些模块需要一些参数.以下示例描述了我的设置:
图书馆:
@Module(
library = true
)
public class LibModule1 {
private final String mString;
public LibModule1(String string) {
mString = string;
}
//... provide methods
}
@Module(
library = true,
addsTo = LibraryModule1.class
)
public class LibModule2 {
private final String mString;
public LibModule2(String string) {
mString = string;
}
//... provide methods
}
注意,LibModule2依赖于LibModule1中提供的一些对象.
应用程式:
在我的应用程序中,我将LibModule1和LibModule2中的对象注入到一个类中.但是我不知道如何组合这些模块. include参数不起作用,因为两个模块都没有no-args构造函数. addTo无效,因为我需要两个库模块,但是参数让我们仅设置一个类.创建两个注入我的类MyClass.class的应用程序模块不起作用(一个类只能由一个模块注入,对吗?!).
@Module(
injects = MyClass.class
)
public class AppModule {
}
我该如何解决这个问题?
解决方法:
您完全可以将模块的实时实例传递给ObjectGraph.create()和graph.plus().如果您有状态模块,则应执行以下操作:
ObjectGraph graph =
ObjectGraph.create(new LibraryModule1("foo"), LibraryModule2("bar));
就是说,如果您以这种方式实例化在问题中描述的库模块,它们将在编译时仍然失败,因为除非您彼此包括(或标记为complete-false),否则它们将失败.您可以简单地让LibModule2包含LibModule1,因为您说它具有依赖于后者提供的对象的对象.
@Module(library = true)
public class LibModule1 {
private final String mString;
public LibModule1(String string) {
mString = string;
}
//... provide methods
}
@Module(includes = LibraryModule1.class)
public class LibModule2 {
private final String mString;
public LibModule2(String string) {
mString = string;
}
//... provide methods
}
我建议您在问题中描述的场景中不要使用complete = false,因此您最终不会避免进行图分析.仅在创建可重用的模块时才应使用complete = false,该模块期望图形状态不能直接通过另一个模块包含,因为它将与在编译时身份未知的模块结合在一起.
如果计划在LibModule1的替代方案中使用LibModule2,则只应执行此处的操作.在上述情况下,没有特别的理由不包括LibModule2中的LibModule1.
complete = false模块从所有图分析中排除,因为它们没有断言其完整性.但是,如果给出了包含,则这两个模块都可以完整.但是您必须将这些模块作为实例传递,因为它们没有no-args构造函数.
您应该只使用library = true来指示提供的某些绑定是供其他依赖项使用的,而不是通过graph.get(Foo.class)作为图的入口点获得的.本质上,库= true模块从孤立绑定分析中排除.
标签:dagger,dependency-injection,android 来源: https://codeday.me/bug/20191122/2057459.html