Guice每个请求模块覆盖?

时间:2015-01-23 05:08:46

标签: java scope guice

我在我工作的代码库中一遍又一遍地看到的是多个工厂或其他对象决策者将采用相同参数并根据该参数决定实现的情况。

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将在请求开始时定义并最终确定。我发现它多余且有潜在危险,我们必须多次这样做才能完成一次。

是否可以定义实现并将它们全部绑定在特定模块中并在每个请求/线程的基础上加载所需的模块?我看到有一个Modules.override(),但这似乎更像是一次性交换测试或开发代码的生产代码,而不是我需要的东西。显然,我不想为我服务的每个请求创建一个注入器。

1 个答案:

答案 0 :(得分:1)

你应该看看guice的多重绑定扩展。它允许您预定义包含提供程序的地图,然后注入该地图并从中进行选择。