Инжекция конструктора использование Guice

У меня есть некоторый пример кода, который использует фабрики. Я хотел бы очистить код путем удаления фабрик и использовать 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 таким образом?

6
задан Jordan Allan 21 January 2010 в 01:03
поделиться

2 ответа

Обратите внимание на AssistedInject . Похоже, это решает эту проблему.

3
ответ дан 17 December 2019 в 04:47
поделиться

2 решения возможны: 1) Свяжите конфиг как объект для гостей, включая его параметр HOST. Тогда просто введите почту, в вашем основном методе, вы можете игнорировать тот факт, что почта имеет дальнейшие зависимости.

2) Почта должна быть настроена индивидуально для каждого отправки (получателя?). Тогда у вас нет выбора, но создайте его, используя MailFactory.

2
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: