我在工作的代码库中一遍又一遍地看到这样一种情况:多个工厂或其他对象决策者将采用相同的参数并根据该参数决定实现。
interface Foo {
foo();
}
interface Bar {
bar();
}
class FooProvider {
... members constructor etc...
Foo get(BazType bazType) {
switch (bazType) {
case BAZ_A:
return bazA;
case BAZ_B:
return bazB;
....
}
}
}
class BarProvider {
Bar get(BazType bazType) {
...same as fooFactory
}
}
... more interfaces and providers follow
这些提供者(工厂?不知道如何调用它们)将在请求的生命周期中在可能不同的类中被调用一次或多次,但 BazType 将在请求开始时定义并最终确定。我发现我们必须多次执行此操作,而实际上只需要执行一次,这是多余的,而且有潜在的危险。
是否可以定义实现并将它们全部绑定(bind)在特定模块中并在每个请求/线程的基础上加载所需的模块?我看到有一个 Modules.override() ,但这似乎更多的是一次性将生产代码替换为测试或开发代码,而不是我需要的。显然,我不想为我服务的每个请求创建一个注入(inject)器。
最佳答案
您应该查看 guice 的多绑定(bind)扩展。它允许您预定义包含您的提供者的映射,然后注入(inject)该映射并从中进行选择。
关于java - Guice 每个请求模块覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28103401/