Предположим, у меня есть некоторый класс 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
, и я, возможно, захочу провести модульное тестирование этой возможности отправки, я думаю, что мне следует внедрить 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. Я думаю, что понимаю инъекцию зависимостей, но не понимаю, как на самом деле реализовать ее с помощью Guice.)