当前位置: 首页 > 知识库问答 >
问题:

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

曹泉
2023-03-14

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

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的能力

    < li >知道如何构造所有这些验证器,将相同的数据源注入所有这些验证器中 < li >使用多绑定器将所有验证器注入到一个类中

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

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

这个答案看起来几乎是我想要的,但它是在Scala中,我对它不够熟悉,无法完全理解。

共有1个答案

任元青
2023-03-14

不需要辅助注射。

您可以像这样绑定< code>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>>(){});
 类似资料:
  • 我有一个关于在Guice中绑定的问题。 Guice不会知道我想要IMYInterface的哪个实现。我是否可以在这个阶段指定注释来有选择地说:我想要MyClass2的实现? 多谢

  • 我有一组15-20个类,它们依赖于一个用绑定类型参数实现泛型接口的类。界面如下所示: 处理程序的单个实现使用反射来处理Foo的所有特殊情况,因为它们都“相似但不同”。 我希望能够在其协作者中以类型安全的方式使用此类,例如: 其中,条形图和Baz都扩展到Foo。不幸的是,Guice抱怨处理程序 我还尝试了以下操作,这会导致编译器错误,因为ConcreteHandler不是Handler的子类 我有这

  • 我有Java接口类。 我有另一个spec builder方法: 以上规范可用于创建客户端: 可用于调用下游客户端获取数据: 我创建了以下客户端规范静态映射:“ContentType”->DownstreamClientSpec 现在我有了一个处理程序方法: 除了contentType的switch语句和特定的客户端创建逻辑之外,我如何基于contentType获得客户端?使用Guice动态绑定特定

  • 对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢

  • 问题内容: 现在,我需要使用以下结构来将多个参数绑定到mysqli查询中: 我使用以下代码计算出问号的数量,并将其插入查询中: 我的问题是,肯定有一种方法可以动态处理查询中尽可能多的输入。硬编码似乎是处理此问题的一种非常糟糕的方法。 我正在使用PHP版本5.4.10 问题答案: 不幸的是,默认情况下,bind_param()不接受数组而不是单独的变量。但是,自PHP 5.6起,将进行重大改进。 要

  • 我有一个预览页面,需要添加或编辑模型,并显示预览。 我需要从添加表单页和编辑表单页调用预览。我要通过的模型是相同的,但来自不同的形式。 (1) ModelAttribute是否有支持这种多属性名称映射的方法?(2) 我怎么能考虑重新设计这个?考虑(a)在表单提交之前重命名表单名称/属性以使用相同的属性名称。(b) 完全删除ModelAttribute——这不是我的选项,因为我使用的是SpringM