2012-07-18 1 views
3

Cet exemple est tiré d'un livre sur Dependency Injection.Exemple d'injection partielle de Guice

Sur la page 87, il y a cet exemple.

public class NewsletterManager { 
    private final List<Recipient> recipients; 
    private final DelivererFactory factory; // The book notes this as injected 

    public NewsletterManager(List<Recipient> rs, DelivererFactory factory) { 
    this.recipients = rs; 
    this.factory = factory; 
    } 

    public void send(Newsletter letter) { 
    for (Recipient recipient : recipients) { 
     Deliverer d = factory.forLetter(letter); 
     d.deliverTo(recipient); 
    } 
    } 

} 

Je comprends ce que le code est censé faire, mais ce que je ne comprends pas comment instancier ou configurer mon Module, afin que je puisse créer des instances de cette classe.

Il semble que le DelivererFactory soit injecté. Les exemples ne disent pas comment, mais admettons que c'est à travers une injection de constructeur. Dans ce cas, comment passer l'instance List<Recipient> qui est particulière à l'instance NewsletterManager que je veux? Comment puis-je utiliser Guice pour instancier mon NewsletterManager avec un DelivererFactory configuré pour un module et une instance particulière List<Recipient>? Ce que je ne comprends pas, c'est comment il peut y avoir à la fois des objets injectés automatiquement et des objets spécifiques à l'instance dans la signature du constructeur. Dans ce cas, je ne vois pas comment je peux obtenir une instance de NewsletterManager ayant seulement mon List<Recipient>. Dois-je compter sur une usine? Dans ce cas, ce qui est l'utilisation de l'injection DelivererFactory, car je vais devoir injecter dans mon usine aussi ...

J'espère que ma question est assez claire ...

Répondre

6

Vous avez raison, ce type d'injection ne peut être résolu qu'en utilisant une usine.

Si vous avez Foo(A a, B b) avec A injecté et B passé lors de l'exécution, vous aurez besoin d'une usine FooFactory.createFoo(B b), qui détient en interne la référence à A.

Heureusement, Guice a le concept d'injection @Assisted. Vous devrez fournir l'interface de l'usine, mais vous pouvez laisser la "magie" de l'implémentation à Guice.

Son assez bien documenté: https://github.com/google/guice/wiki/AssistedInject

Vous aurez besoin d'une dépendance supplémentaire à com.google.inject.extensions »assisté par injection Guice-