【问题标题】:Binding same parameter to multiple implementations with Guice's MultiBinder and Asisstedinjection使用 Guice 的 MultiBinder 和 Asisstedinjection 将相同的参数绑定到多个实现
【发布时间】:2020-11-08 20:03:44
【问题描述】:

我有一组验证器类,它们都扩展了一个通用抽象类,都具有相同的构造函数

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. 知道如何构造所有这些验证器,将相同的 DataSource 注入到所有这些验证器中
  2. 使用MultiBinder 将所有验证器注入到一个类中

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

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

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

【问题讨论】:

    标签: java guice


    【解决方案1】:

    不需要辅助注射。

    您可以像这样绑定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>>(){});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多