我正在考虑在我的应用程序中使用Guice for DI,我应该能够在运行时交换实现。下面提供了一个示例来说明要求:
class ValidationEngine {
public void validate(ValidationService vs) {}
}
class Client1_ValidationService implements ValidationService {}
class Client2_ValidationService implements ValidationService {}
以上实现之一应绑定为在运行时基于客户端名称(例如Client1或Client2)验证功能
我想到了像这样更改ValidationEngine:
class ValidationEngine {
@Inject
@Named("vServicee") ValidationService vs;
public void validate() {
vs.validate()
}
}
上面方法的问题是@Named批注的参数是静态的。实际上,注释不接受运行时值。Guice中是否还有其他方法可以解决此类问题?
您可以尝试使用Injector.createChildInjector为每个ValidationService
实现创建自己的注射器:
Injector client1Injector = injector.createChildInjector(new Module() {
@Override
public void configure(final Binder binder) {
binder
.bind(ValidationService.class)
.to(Client1_ValidationService.class);
}
});
ValidationEngine client1Engine =
client1Injector.getInstance(ValidationEngine.class)
但这意味着您必须以某种方式管理所有子注入器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句