2012-02-06 5 views
12

मान लीजिए कि मेरे पास कुछ Message वर्ग निम्न हैं।गिइस इंजेक्शन केवल कुछ कन्स्ट्रक्टर

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 कार्यान्वयन है, और इकाई परीक्षण इस भेजने की क्षमता है, मुझे लगता है कि मैं इंजेक्शन लगाने की जानी चाहिए MessageSenderMessage के में send() विधि करने के लिए चाहते हो सकता है । लेकिन मैं यह कैसे करूँ?

सभी Guice उदाहरण मैंने देखा है और मैं समझता हूँ कि निर्माता में इंजेक्शन करने के लिए लग रहे हैं:

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 बहस में ले जाता है, जो मैं नहीं इंजेक्ट करना चाहते हैं। तो मुझे इसके बजाय क्या करना चाहिए?

(नोट:।। मैं एक पूरी गूगल Guice noob हूँ मुझे लगता है कि मैं निर्भरता इंजेक्शन समझते हैं, लेकिन मुझे समझ नहीं आता कि कैसे वास्तव में Guice के साथ इसे लागू करने के)

उत्तर

19

आप सहायता प्रदान प्रदान करने के लिए इस्तेमाल कर सकते हैं इंजेक्शन एक कारखाने के माध्यम से पाठ, संदेश भेजने Guice द्वारा instantiated के साथ:

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