2010-01-20 27 views
6

Ho un codice di esempio che utilizza le fabbriche. Mi piacerebbe ripulire il codice rimuovendo le fabbriche e invece Guice. Ho provato a farlo ma ho colpito un piccolo posto di blocco. Sono davvero nuovo a Guice, quindi spero che qualcuno possa aiutarmi qui.Iniezione costruttore con Guice

Codice esistente del cliente (Uso fabbriche):

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

Il mio tentativo di refactoring utilizzando 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(); 
    } 
} 

Come potrei costruire un'istanza MailImpl utilizzando l'oggetto config nel mio rivisto Mailclient? Dovrei usare Guice in questo modo?

risposta

3

Dai uno sguardo allo AssistedInject. Sembra affrontare questo problema.

2

Sono possibili 2 soluzioni: 1) associare anche la configurazione come oggetto guice, incluso il suo parametro host. quindi inserisci semplicemente Mail, nel tuo metodo principale ignori il fatto che la posta ha ulteriori dipendenze.

2) la posta deve essere configurata singolarmente per ogni invio (destinatario?). allora non hai scelta, ma creala tu stesso usando MailFactory.

0

si può fare tutto in MailModule come segue:

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

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

Se si desidera un Singleton MailConfig, aggiungere l'annotazione @Singleton a getMailConfig(), e di tuo zio Bob.

Si noti che gli argomenti per getMailConfig devono essere associati. Quando si vincolano tipi di uso comune come String, assicurarsi di aggiungere un'annotazione vincolante.

Problemi correlati