2010-01-20 14 views
6

Tengo un código de muestra que está utilizando fábricas. Me gustaría limpiar el código eliminando las fábricas y usando Guice. Intenté hacer esto pero di con un pequeño obstáculo. Soy realmente nuevo para Guice, así que espero que alguien pueda ayudarme aquí.Inyección de constructor usando Guice

vigente Código cliente (usando fábricas):

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(); 
    } 
} 

Mi intento de refactorizar usando 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(); 
    } 
} 

¿Cómo iba a construir una instancia de MailImpl utilizando el objeto config en mi ClienteDeCorreo revisada? ¿Debo usar Guice de esta manera?

Respuesta

2

2 soluciones posibles: 1) enlazar la configuración como un objeto guice también, incluido su parámetro de host. luego simplemente inyecte Mail, en su método principal puede ignorar el hecho de que el correo tiene más dependencias.

2) el correo se debe configurar individualmente para cada envío (destinatario?). entonces no tiene otra opción, pero créelo usted mismo usando MailFactory.

0

se puede hacer todo en MailModule de la siguiente manera:

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

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

Si desea un producto único MailConfig, añadir la anotación @Singleton a getMailConfig(), y Bob es tu tío.

Tenga en cuenta que los argumentos para getMailConfig deben estar vinculados. Cuando vincula tipos comúnmente utilizados como String, asegúrese de agregar una anotación de enlace.

Cuestiones relacionadas