3

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

图书馆:

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

@Module(
    injects = MyClass.class
)
public class AppModule {

}

我该如何解决这个问题?

4

2 回答 2

4

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

ObjectGraph graph = 
    ObjectGraph.create(new LibraryModule1("foo"), LibraryModule2("bar));

也就是说,如果您以这种方式实例化您在问题中描述的库模块,它们仍然会在编译时失败,因为它们除非您相互包含(或标记为完全错误)。您可以简单地让 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 模块被排除在所有图形分析之外,因为它们不断言它们的完整性。但是,如果给出包含,这两个模块都可以是完整的。但是您必须将这些模块作为实例传递,因为它们没有无参数构造函数。

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

于 2014-02-06T08:00:11.300 回答
-1

I'm sorry, I did something wrong. Now it works.

Answering my own question: You need to include the library modules.

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

}

In one module I was missing a complete = false parameter.

于 2014-02-05T16:08:38.437 回答