使用 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 能够
- 了解如何构建所有这些验证器,将相同的数据源注入所有验证器
- 使用 MultiBinder
将所有验证器注入 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>>(){});
我有一组验证器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 能够
- 了解如何构建所有这些验证器,将相同的数据源注入所有验证器
- 使用 MultiBinder 将所有验证器注入 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>>(){});