2012-07-18 61 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»吉斯輔助-注入