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

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(),但是似乎将生产代码换成测试或开发代码而不是我需要的只是一次。显然,我不想为我服务的每个请求创建一个注射器。

最佳答案

您应该检查guice多绑定扩展。它使您可以预定义包含提供商的地图,然后注入该地图并从中进行选择。
Multibindings
MapBinder

09-13 02:32