Android Dagger-没有参数构造函数的模块

Android Dagger-没有参数构造函数的模块,android,dependency-injection,dagger,Android,Dependency Injection,Dagger,如何组合没有参数构造函数的模块。我有一个包含多个模块的库,我想在我的应用程序中重用这些模块。但是,这些模块需要一些参数。以下示例介绍了我的设置: 库: @Module( library = true ) public class LibModule1 { private final String mString; public LibModule1(String string) { mString = string; } //... p

如何组合没有参数构造函数的模块。我有一个包含多个模块的库,我想在我的应用程序中重用这些模块。但是,这些模块需要一些参数。以下示例介绍了我的设置:

库:

@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中的对象注入到一个类中。但我不知道,我如何才能组合这些模块。includes参数不起作用,因为两个模块都没有args构造函数。addsTo不起作用,因为我需要两个库模块,但是参数让我只设置一个类。创建两个应用程序模块注入我的类MyClass.class不起作用(一个类只能注入一个模块,对吗?!)


我如何解决这个问题?

对不起,我做错了什么。现在它起作用了

回答我自己的问题:您需要包括库模块

@Module(
    injects = MyClass.class,
    includes = {LibModule1.class, LibModule2.class}
)
public class AppModule {

}

在一个模块中,我缺少一个complete=false参数。

您完全可以将模块的活动实例传递给ObjectGraph.create()和graph.plus()。如果您有状态模块,则应执行以下操作:

ObjectGraph graph = 
    ObjectGraph.create(new LibraryModule1("foo"), LibraryModule2("bar));
也就是说,如果您以这种方式实例化您在问题中描述的库模块,它们在编译时仍然会失败,因为除非您包含彼此(或将complete false标记为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模块被排除在所有图形分析之外,因为它们不断言其完整性。但如果给出了包含条件,这两个模块都可以完成。但您必须将这些模块作为实例传入,因为它们没有args构造函数


您应该只使用library=true来表示提供的某些绑定是供其他依赖项使用的,而不是通过graph.get(Foo.class)作为图形的入口点来获取。基本上,library=true模块被排除在孤立绑定分析之外。

这并不理想,尽管这是可能的。与其将LibModule2标记为不完整,并将其包含在第三个模块中,您只需将LibModule1包含在LibModule2中即可。如果您计划在LibModule1的替代方案的上下文中使用LibModule2,那么您应该只做您正在做的事情。非常感谢您的详细说明。我没有发现文档中“include”和“addsTo”的区别。如果我错了,请纠正我:只有在调用另一个ObjectGraph上的.plus()时,才应使用“addsTo”。例如,这用于具有活动范围的ObjectGraph。在应用程序ObjectGraph上调用plus()。所以活动模块使用“addsTo”。是的。我需要在这两个方面加强一些文档,尽管我希望在其中获得自定义范围注释并加强文档:/总的来说,除非我们在我们的方法中猜错了,Dagger2.0应该不需要addsTo,并且将有一个完全不同的机制,它是优越的,但是我们在这方面还有几个月的时间。
@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 
}