java - Guice 每个请求模块覆盖?

标签 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 将在请求开始时定义并最终确定。我发现我们必须多次执行此操作,而实际上只需要执行一次,这是多余的,而且有潜在的危险。

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

最佳答案

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

关于java - Guice 每个请求模块覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28103401/

相关文章:

java - 通过 Guice TypeListener 对 Guava EventBus 订阅者进行热切实例化

reactjs - 在 Jest 中使用范围包

java - 如何在 JSF 2.0 中创建自定义 404 消息?

java - Fiji/Weka 生成的 arff 文件中的原始属性

java - 错误 :(9, 0): 'google()' Gradle DSL 方法未找到

javascript - 为什么 block 作用域最初不是在 JavaScript 中实现的?

javascript - 如何在页面重新加载时清除 JavaScript 变量?

java - 如何混合使用 Guice 和 Jersey 注入(inject)?

java - 使用 guice 构造函数参数注入(inject)

java - 向用户数据添加方法