2012-02-06 37 views
12

Giả sử tôi có một số lớp Message như sau. (Đây là một lớp học làm-up cho đơn giản.)Chỉ cần tiêm một số hàm tạo

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

Kể từ khi tôi có khác nhau MessageSender triển khai, và có thể muốn đơn vị kiểm tra khả năng gửi tin nhắn này, tôi nghĩ rằng tôi nên tiêm MessageSender trong Message 's send() phương pháp . Nhưng làm thế nào để tôi làm điều này?

Tất cả các ví dụ Guice Tôi đã nhìn thấy và tôi hiểu dường như làm các việc tiêm trong constructor:

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

Nhưng lớp Message tôi mất trong một cuộc tranh luận text trong constructor của nó, mà tôi không muốn tiêm. Vậy tôi phải làm gì?

(Lưu ý:.. Tôi là một Noob Google Guice hoàn thành Tôi nghĩ rằng tôi hiểu dependency injection, nhưng tôi không hiểu làm thế nào để thực sự thực hiện nó với Guice)

Trả lời

19

Bạn có thể sử dụng hỗ trợ tiêm để cung cấp các văn bản thông qua một nhà máy, cùng với người gửi thư instantiated bởi Guice:

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

Factory:

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

module:

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

sử dụng:

@Inject MessageFactory messageFactory; 

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

Assisted Injection Wiki

Các vấn đề liên quan