5

这个例子取自一本关于Dependency Injection的书。

在第 87 页,有这个例子。

public class NewsletterManager {
  private final List<Recipient> recipients;
  private final DelivererFactory factory; // The book notes this as injected

  public NewsletterManager(List<Recipient> rs, DelivererFactory factory) {
    this.recipients = rs;
    this.factory = factory;
  }

  public void send(Newsletter letter) {
    for (Recipient recipient : recipients) {
      Deliverer d = factory.forLetter(letter);
      d.deliverTo(recipient);
    }
  }

}

我了解代码的用途,但我不了解的是如何实例化或配置 my Module,以便我可以创建此类的实例。

似乎DelivererFactory被注入了。示例没有说明如何,但让我们承认它是通过构造函数注入。在那种情况下,如何传递List<Recipient>特定于NewsletterManager我想要的实例的实例?如何使用 Guice 来实例化我NewsletterManager的模块配置DelivererFactory和特定List<Recipient>实例?

我不明白的是如何在构造函数的签名中同时自动注入对象和特定于实例的对象。在这种情况下,我不知道如何获得NewsletterManager只有我的List<Recipient>. 我必须依赖工厂吗?那样的话,DelivererFactory打针有什么用,我厂里也得打针……

我希望我的问题足够清楚......

4

1 回答 1

10

你是对的,这种注入只能通过工厂来解决。

如果您Foo(A a, B b)在运行时注入了 A 并传递了 B,您将需要一个 Factory FooFactory.createFoo(B b),它在内部保存对 A 的引用。

幸运的是,Guice 有@Assisted Injection 的概念。您必须提供工厂的接口,但可以将实现的“魔力”留给 Guice。

它有很好的记录:https ://github.com/google/guice/wiki/AssistedInject

您将需要对 com.google.inject.extensions » guice-assisted-inject 的额外依赖

于 2012-07-18T18:52:17.910 回答