2017-02-08 2 views
0

J'ai besoin de plusieurs instances de X injectées à différents endroits. J'ai implémenté un Guice Provider personnalisé pour fournir différentes instances d'une classe X comme suit.DRY Fournisseur Guice personnalisé avec paramètres

public class XProvider implements Provider<X> { 
    private final Factory f; 
    private final String NAME = "Something String"; 

    @Inject 
    public XProvider(Factory f) { 
     this.f = f; 
    } 

    public X get() { 
     return new X(f, NAME); 
    } 
} 

Parce que je dois autre exemple de X avec une valeur différente de NAME, je dois avoir plusieurs classes similaires comme XProvider1, XProvider2, etc., qui ne différent dans un champ. Créer une classe abstraite à partir de ne permet pas de réduire la quantité de code redondant car (1) cacher le champ n'est pas bon (2) si je ne cache pas le champ, j'ai encore besoin d'avoir le constructeur dans la sous-classe .

Je ne peux pas utiliser l'injection assistée parce que je ne possède pas X donc je change son constructeur.

Il doit y avoir une meilleure façon de le faire, soit une façon plus intelligente d'utiliser Guice ou une autre pour restructurer mon code. Je cherche un conseil pour le changement ici.

Merci,

Répondre

1

Si vous avez ensemble prédéfini limité d'arguments possibles, vous pouvez utiliser le nom @Provides de liaison dans le module Guice:

@Provides @Named("Type 1") MyClass getType1() {return new MyClass("Param of type 1");} 
@Provides @Named("Type 2") MyClass getType2() {return new MyClass("Param of type 2");} 

puis l'injecter avec des noms

@Inject @Named("Type 1") 
private MyClass instance, anotherInstance; 

ps. Vous pouvez passer tous les paramètres injectables aux méthodes @Provides, c'est-à-dire getType2 (Usine d'usine) {return ...

+0

Merci. Ça marche. – chepukha