2012-02-06 9 views
12

Aşağıdaki gibi bazı Message sınıfına sahip olduğumu varsayalım. (Bu basitlik için uydurma bir sınıftır.)Yalnızca yapıcıdan bazılarını enjekte eden kılavuz

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

farklı MessageSender uygulamaları var ve birim testi bu gönderme yeteneği, ben MessageSenderMessage 's send() yöntemi enjekte edilmesi gerektiğini düşünüyorum isteyebilirsiniz yana . Ama bunu nasıl yaparım?

gördüğüm tüm Guice örnekler

ve Kurucuda enjeksiyon yapmak gibi görünüyor anlamaları:

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

Ama Message sınıf I do not, hangi onun kurucu bir text argüman alır enjekte etmek istiyorum. Öyleyse bunun yerine ne yapmalıyım?

(Not:.. Ben bağımlılık enjeksiyon anlıyorum komple Google Guice çaylak değilim, ama aslında Guice ile nasıl uygulanacağı konusu anlamıyorum)

Sen sağlamak için enjeksiyon destekli kullanabilir olabilir

cevap

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

Fabrika:

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

Modül:

Guice tarafından örneği ileti gönderen ile birlikte bir fabrika aracılığıyla metin
public class MessageSenderModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    bind(MessageSender.class).to(EmailBasedMessageSender.class); 
    FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder(); 
    install(factoryModuleBuilder.build(MessageFactory.class)); 
    } 
} 

kullanımı:

@Inject MessageFactory messageFactory; 

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

Assisted Injection Wiki

İlgili konular