2010-01-20 1 views
6

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

ответ

2

Возможны 2 решения: 1) также связывает конфигурацию как объект guice, включая его параметр хозяина. то просто введите Mail, в вашем основном методе вы cna игнорируете тот факт, что почта имеет дополнительные зависимости.

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

0

Вы можете сделать все, что в MailModule следующим образом:

public class MailModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     ... // other bindings 
    } 

    @Provides 
    MailConfig getMailConfig(...) { 
     MailConfig config = new MailConfig(...); 
     config.setHost("smtp.gmail.com"); 
     config; 
    } 
} 

Если вы хотите одноплодной MailConfig, добавить аннотацию @Singleton к getMailConfig(), и Боба твой дядя.

Обратите внимание, что аргументы для getMailConfig должны быть связаны. Когда вы привязываете обычно используемые типы, такие как String, обязательно добавляйте аннотацию привязки.

 Смежные вопросы

  • Нет связанных вопросов^_^