【问题标题】:Guice per request module override?每个请求模块覆盖的Guice?
【发布时间】:2015-01-23 05:08:45
【问题描述】:

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

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

【问题讨论】:

    标签: java scope guice


    【解决方案1】:

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

    【讨论】:

    • 除非我错过了什么,否则这并不能真正让我得到我想要的。我将用 map.get(BazType) 替换每个 switch 语句。我同意这将比我们目前所做的有所改进(已在此处进行了辩论),但它仍然是在整个请求流程中多次做出的决定,而不是一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多