使用 Guice 的 MultiBinder 和 Assistedinjection 将相同的参数绑定到多个实现

Binding same parameter to multiple implementations with Guice's MultiBinder and Asisstedinjection

我有一组验证器classes,它们都扩展了一个公共抽象class,都具有相同的构造函数

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

我希望 Guice 能够

  1. 了解如何构建所有这些验证器,将相同的数据源注入所有验证器
  2. 使用 MultiBinder
  3. 将所有验证器注入 class

通过一些谷歌搜索,看起来我可以使用 AssistedInject,但问题是如果我想这样做,我将不得不为每个验证器创建一个工厂,这是一个巨大的数量样板。因为它们都有相同的构造函数,所以我觉得一定有更好的方法。我的 DataSource 对象是在 Guice 之外创建的,我只想将它绑定到 configure.

DataSource.class 的所有实例

我愿意改变的一件事是拥有某种工厂方法,允许我仅从 DataSource...创建验证器...我认识到我使用构造函数的愿望可能不是输入安全。

This answer 看起来和我想要的差不多,但它是在 Scala 中,我对它还不够熟悉,无法完全理解。

不需要AssistedInject。

您可以像这样绑定 DataSource 的实例:

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