0

我有一些看起来像这样的代码(简化):

public Reader newInstance(Catalog catalog) {
    Mapper mapper = new Mapper(catalog);
    return new Reader(mapper)
}

public main() {
    // expensive operation
    Catalog catalog = readCatalogFromDatabase();

    Reader reader = Reader.newInstance(catalog);
    // do stuff with reader
}

如何重新设计它以便我仍然创建目录,但 Guice 创建阅读器和映射器?我尝试使用辅助注入,但由于 Catalog 不是 Reader 的直接依赖项,我无法弄清楚如何获取接受目录对象的工厂方法。

4

1 回答 1

3

有两种方法可以做到这一点:

  1. 让 Guice 绑定您的目录。这可能意味着将 Catalog 实例传递给您的 Module,但 Modules 可以采用任意数量的构造函数参数,所以这没有问题。在您的模块中,这将如下所示:

    bind(Catalog.class).toInstance(myVeryExpensiveCatalog);
    
  2. 如果您确实需要基于未知或可变的 Catalog 实例创建 Reader,那么您的直觉是使用辅助注入。这就是我让它看起来的样子:

    class Reader {
      interface Factory {
        Reader create(Catalog catalog);
      }
    
      @Inject Reader(@Assisted Catalog catalog, OtherDependency etc) {
        this.catalog = catalog;
      }
    }
    
    class YourModule extends AbstractModule {
      @Override public void configure() {
        install(new FactoryModuleBuilder().build(Reader.Factory.class));
      }
    }
    

    然后你可以Reader.Factory通过调用来注入和获取你的读者readerFactory.create(catalog);。请注意,create可以命名任何东西,并且Factory可以在任何位置使用任何名称——这些只是我喜欢的名称和位置。

现在,在AssistedInject 文档中,您会看到它们也调用implement. 如果是一个接口,您只需要这样做Reader,因此 Guice 知道要构建什么样的具体类来满足create的返回类型。

希望这可以帮助!

于 2012-09-20T23:15:15.343 回答