Предположим, что у меня есть класс 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
и, возможно, мне захочется unit test эта возможность отправки, я думаю, что мне нужно вводить метод MessageSender
в Message
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
, который я не хочу вводить. Итак, что я должен делать вместо этого?
(Примечание: я полный Google Guice noob. Я думаю, что я понимаю инъекцию зависимостей, но я не понимаю, как реально реализовать его с Guice.)