2010-01-20 8 views
6

J'ai un exemple de code qui utilise des usines. Je voudrais nettoyer le code en supprimant les usines et utiliser Guice à la place. J'ai essayé de le faire mais j'ai heurté un petit barrage routier. Je suis vraiment nouveau à Guice, alors j'espère que quelqu'un pourra m'aider ici.Construire l'injection en utilisant Guice

code client existant (usines Utilisation):

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

Ma tentative de factoriser en utilisant 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(); 
    } 
} 

Comment puis-je construire une instance de MailImpl en utilisant l'objet config dans mon MailClient révisé? Dois-je utiliser Guice de cette façon?

Répondre

2

2 solutions sont possibles: 1) lier la config en tant qu'objet guice, y compris son paramètre hôte. Il suffit ensuite d'injecter Mail, dans votre méthode principale vous pouvez ignorer le fait que le courrier a d'autres dépendances.

2) Le courrier doit être configuré individuellement pour chaque envoi (destinataire?). alors vous n'avez pas le choix, mais créez-le vous-même en utilisant MailFactory.

0

Vous pouvez faire tout MailModule comme suit:

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 vous voulez un singleton mailconfig, ajoutez l'annotation @Singleton à getMailConfig(), et votre oncle Bob.

Notez que les arguments de getMailConfig doivent être liés. Lorsque vous liez des types couramment utilisés tels que String, veillez à ajouter une annotation de liaison.