带参数的 DRY 自定义 Guice 提供程序
DRY Custom Guice Provider with parameters
我需要在不同地方注入多个 X
实例。
我实现了一个自定义 Guice 提供程序来提供 class 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);
}
}
因为我需要具有不同 NAME
值的 X 的不同实例,所以我需要多个相似的 classes
像 XProvider1、XProvider2 等,只有一个领域不同。
创建一个抽象 class 来扩展无助于减少冗余代码量,因为(1)隐藏字段不好
(2) 如果我不隐藏字段,我仍然需要在 subclass 中有构造函数。
我不能使用 Assisted Injection 因为我不拥有 X
所以我更改了它的构造函数。
必须有更好的方法来做到这一点,要么是使用 Guice 的更聪明的方法,要么是另一种方法来重构我的代码。
我在这里寻找一些改变的建议。
谢谢,
如果您预定义了一组有限的可能参数,则可以在 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 ...
我需要在不同地方注入多个 X
实例。
我实现了一个自定义 Guice 提供程序来提供 class 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);
}
}
因为我需要具有不同 NAME
值的 X 的不同实例,所以我需要多个相似的 classes
像 XProvider1、XProvider2 等,只有一个领域不同。
创建一个抽象 class 来扩展无助于减少冗余代码量,因为(1)隐藏字段不好
(2) 如果我不隐藏字段,我仍然需要在 subclass 中有构造函数。
我不能使用 Assisted Injection 因为我不拥有 X
所以我更改了它的构造函数。
必须有更好的方法来做到这一点,要么是使用 Guice 的更聪明的方法,要么是另一种方法来重构我的代码。 我在这里寻找一些改变的建议。
谢谢,
如果您预定义了一组有限的可能参数,则可以在 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 ...