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模块从孤立绑定分析中排除.

上一篇:匕首嵌套嵌套,是否有必要调用inject()?


下一篇:JSLink and Display Templates Part 2 – Changing how individual fields display