4 votes

Fournisseur générique Guice (le fournisseur lui-même est générique, pas la classe à laquelle il est lié)

Il existe de nombreuses ressources en ligne sur la manière d'utiliser un fournisseur Guice pour lier à une classe générique, telles que des entrées wiki comme celle-ci et des questions SOF comme celle-ci. Cependant, j'ai du mal à trouver une ressource sur la manière d'utiliser un fournisseur qui soit lui-même générique.

Par exemple, supposons que j'ai ce qui suit:

public interface Foo {
    ...
}

public class Bar implements Foo {
    ...
}

Comme vous pouvez le voir, Bar a un paramètre d'injection qui DOIT être dans le constructeur. Dans ma situation, nous ne pouvons pas déplacer ce paramètre vers une injection de champ ou de méthode.

Donc, maintenant je veux écrire un Provider pour Foo, mais qu'il renvoie une instance de Bar. Quelque chose comme ceci:

@Singleton
public class FooProvider extends Provider {
    @Inject
    public FooProvider(Object someParameterWeMustInjectIntoConstructor) {
        ...
    }
    ...
    @Override
    public Foo get() {
        return new Bar(...);
    }
    ...
}

Remarquez comment cette classe est un singleton qui dépend de l'injection Guice elle-même, donc le Provider doit être configuré en utilisant .toProvider(FooProvider.class). Nous ne pouvons également utiliser que l'injection de constructeur et non l'injection de méthode ou de champ, peut-être en raison d'une hiérarchie de types avec ce Provider.

J'essaie de trouver une sorte de moyen d'utiliser .toProvider(FooProvider.class), mais nous savons tous que ce n'est pas une syntaxe Java valide. Quelqu'un sait-il comment je peux utiliser la méthode .toProvider(Class) d'un binder Guice dans un Module pour utiliser un Provider générique afin de créer une classe concrète d'une implémentation ? Faites-moi savoir si ma question est un peu confuse.

9voto

Tavian Barnes Points 2899
toProvider(new TypeLiteral>() { });

Translated to :

toProvider(new TypeLiteral>() { });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X