J'ai un ensemble de classes de validation qui étendent toutes une classe abstraite commune, toutes avec le même constructeur

public abstract class AbstractValidator {
    public AbstractValidator(DataSource dataSource) {
        // ...
    }
}

public class Validator1 extends AbstractValidator {
    public Validator1(DataSource dataSource) {
        super(dataSource);
    }
}

public class Validator2 extends AbstractValidator {
    public Validator2(DataSource dataSource) {
        super(dataSource);
    }
}

Je veux que Guice puisse

  1. Savoir construire tous ces validateurs, en injectant le même DataSource dans chacun d'eux
  2. Injectez tous les validateurs dans une classe à l'aide d'un MultiBinder

Grâce à quelques recherches sur Google, il semblait que je pourrais utiliser AssistedInject, mais le problème est que si je voulais faire cela, je devrais créer une usine pour chaque validateur, ce qui est une énorme quantité de passe-partout. Parce qu'ils ont tous le même constructeur, je pense qu'il doit y avoir un meilleur moyen. Mon objet DataSource est créé en dehors de Guice, et je veux juste le lier à toutes les instances de DataSource.class dans mon configure.

Une chose que je suis prêt à changer est d'avoir une sorte de méthode d'usine qui me permettrait de créer un validateur à partir d'un simple DataSource... Je reconnais que mon désir d'utiliser des constructeurs pourrait ne pas être de type sûr.

Cette réponse ressemble presque à ce que je veux , mais c'est en Scala, que je ne connais pas assez pour bien comprendre.

1
ollien 8 nov. 2020 à 07:00

1 réponse

Meilleure réponse

Il n'y a pas besoin d'AssistedInject.

Vous pouvez lier votre instance de DataSource comme ceci :

DataSource dataSource = ...;
Injector injector = Guice.createInjector(new AbstractModule() {
  @Provides @Singleton DataSource provideDataSource() { return dataSource; }
  @ProvidesIntoSet Validator provideValidator1(DataSource dataSource) { return new Validator1(dataSource); }
  @ProvidesIntoSet Validator provideValidator2(DataSource dataSource) { return new Validator2(dataSource); }
});

Set<Validator> validators = injector.get(new Key<Set<Validator>>(){});
1
Olivier Grégoire 8 nov. 2020 à 12:03