2012-07-18 49 views
3

本示例摘自一本关于Dependency Injection的书。Guice局部注射示例

在页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); 
    } 
    } 

} 

我明白代码的意思做,但我不明白的是如何实例化,或配置我Module,这样我可以创建该类的实例。

看起来DelivererFactory被注入。这些例子没有说明如何,但让我们承认它是通过构造函数注入的。在那种情况下,如何通过List<Recipient>实例,这对我想要的NewsletterManager实例特别有用?我怎样才能使用Guice实例化我的NewsletterManager模块配置的DelivererFactory和特定的List<Recipient>实例?

我没有得到的是如何在构造函数的签名中同时自动注入对象和特定于实例的对象。在这种情况下,我看不到我如何获得只有我的List<Recipient>NewsletterManager实例。我必须依赖工厂吗?在这种情况下,有什么用的DelivererFactory注射的,因为我将在我的工厂也注入吧...

我希望我的问题是不够清楚......

回答

6

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

如果你有Foo(A a, B b)有一个被注入和B在运行时通过,你将需要一个工厂FooFactory.createFoo(B b),在内部持有参考A.

幸运的是,吉斯有@Assisted注入​​的概念。您将不得不提供工厂界面,但可以将实施的“魔力”留给Guice。

它非常有据可查:https://github.com/google/guice/wiki/AssistedInject

您将需要一个额外的依赖关系com.google.inject.extensions»吉斯辅助-注入