У меня есть некоторый пример кода, который использует фабрики. Я хотел бы очистить код путем удаления фабрик и использовать Guice вместо этого. Я попытался сделать это, но я поразил маленький контрольно-пропускной пункт. Я действительно плохо знаком с Guice, таким образом, я надеюсь, что кто-то может помочь мне здесь.
Существующий клиентский код (Используя фабрики):
public class MailClient {
public static void main(String[] args) {
MailConfig config = MailConfigFactory.get();
config.setHost("smtp.gmail.com");
Mail mail = MailFactory.get(config);
mail.send();
}
}
Моя попытка осуществить рефакторинг использование Guice:
//Replaces existing factories
public class MailModule extends AbstractModule {
@Override
protected void configure() {
bind(Mail.class)
.to(MailImpl.class);
bind(MailConfig.class)
.to(MailConfigImpl.class);
}
}
public class MailImpl implements Mail {
private final MailConfig config;
@Inject
public MailImpl(MailConfig config) {
this.config = config;
}
public void send() { ... }
}
public class MailClient {
public static void main(String[] args) {
MailModule mailModule = new MailModule();
Injector injector = Guice.createInjector(mailModule);
MailConfig config = injector.getInstance(MailConfig.class);
config.setHost("smtp.gmail.com");
Mail mail = //??
mail.send();
}
}
Как я создал бы экземпляр MailImpl
использование объекта config
в моем пересмотренном MailClient? Я должен использовать Guice таким образом?
Обратите внимание на AssistedInject . Похоже, это решает эту проблему.
2 решения возможны: 1) Свяжите конфиг как объект для гостей, включая его параметр HOST. Тогда просто введите почту, в вашем основном методе, вы можете игнорировать тот факт, что почта имеет дальнейшие зависимости.
2) Почта должна быть настроена индивидуально для каждого отправки (получателя?). Тогда у вас нет выбора, но создайте его, используя MailFactory.