2012-02-06 142 views
12

假設我有一些Message類,如下所示。 (這是爲了簡單起見,虛構的類。)Guice只注入一些構造函數

public class Message { 
    private String text; 

    public Message(String text) { 
    this.text = text; 
    } 

    public void send(Person recipient) { 
    // I think I should be Guice-injecting the sender. 
    MessageSender sender = new EmailBasedMessageSender(); 
    sender.send(recipient, this.text); 
    } 
} 

由於我有不同MessageSender實現,並且可能要進行單元測試這種發送能力,我想應當注入MessageSenderMessagesend()方法。但我該怎麼做?

所有吉斯的例子我見過和我的理解似乎做注射在構造函數:

public class Message { 
    private String text; 
    private MessageSender sender; 

    // ??? I don't know what to do here, since the `text` argument shouldn't be injected. 
    @Inject 
    public Message(String text, MessageSender sender) { 
    this.text = text; 
    this.sender = sender; 
    } 

    public void send(Person recipient) { 
    this.sender.send(recipient, this.text); 
    } 
} 

public class MessageSenderModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    bind(MessageSender.class).to(EmailBasedMessageSender.class); 
    } 
} 

但我Message類需要在text參數的構造函數中,我不想要注入。那麼我該怎麼做呢?

(注:我是一個完整的谷歌吉斯小白我想我明白依賴注入,但我不明白如何真正與吉斯實現它)

回答

19

你可以使用輔助注塑提供通過工廠文字,與由實例化吉斯消息發送者沿着:

public class Message { 
    private String text; 
    private MessageSender sender; 

    @Inject 
    public Message(@Assisted String text, MessageSender sender) { 
    this.text = text; 
    this.sender = sender; 
    } 

    public void send(Person recipient) { 
    this.sender.send(recipient, this.text); 
    } 
} 

工廠:

public interface MessageFactory{ 
    Message buildMessage(String text); 
} 

模塊:

public class MessageSenderModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    bind(MessageSender.class).to(EmailBasedMessageSender.class); 
    FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder(); 
    install(factoryModuleBuilder.build(MessageFactory.class)); 
    } 
} 

用法:

@Inject MessageFactory messageFactory; 

void test(Recipient recipient){ 
    Message message = messageFactory.buildMessage("hey there"); 
    message.send(recipient); 
} 

Assisted Injection Wiki