【问题标题】:DRY Custom Guice Provider with parameters带参数的 DRY 自定义 Guice 提供程序
【发布时间】:2017-02-08 07:07:31
【问题描述】:

我需要在不同的地方注入多个X 实例。 我实现了一个自定义 Guice Provider 来提供 X 类的不同实例,如下所示。

public class XProvider implements Provider<X> {
    private final Factory f;
    private final String NAME = "Something String";

    @Inject
    public XProvider(Factory f) {
       this.f = f;
    }

    public X get() {
        return new X(f, NAME);
    }
}

因为我需要不同的 X 实例和不同的 NAME 值,我需要有多个相似的类 像 XProvider1、XProvider2 等,只有一个字段不同。 创建一个抽象类来扩展无助于减少冗余代码的数量,因为(1)隐藏字段不好 (2)如果我不隐藏字段,我仍然需要在子类中有构造函数。

我不能使用辅助注射,因为我不拥有X,所以我更改了它的构造函数。

必须有更好的方法来做到这一点,要么是使用 Guice 的更聪明的方法,要么是另一种重构我的代码的方法。 我在这里寻找一些改变的建议。

谢谢,

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    如果您预定义了一组有限的可能参数,您可以在 guice 模块中使用命名的 @Provides 绑定:

    @Provides @Named("Type 1") MyClass getType1() {return new MyClass("Param of type 1");}
    @Provides @Named("Type 2") MyClass getType2() {return new MyClass("Param of type 2");}
    

    然后用名字注入它

    @Inject @Named("Type 1") 
    private MyClass instance, anotherInstance;
    

    ps。您可以将任何可注入参数传递给@Provides 方法,即 getType2(Factory factory) {return ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      相关资源
      最近更新 更多