程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Guice 每个请求模块覆盖?

发布于2023-05-05 19:12     阅读(1152)     评论(0)     点赞(11)     收藏(0)


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

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 的多重绑定扩展。它允许您预定义包含您的提供商的地图,然后注入该地图并从中选择。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/673185/955e3dee17b576e505c9/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

11 0
收藏该文
已收藏

评论内容:(最多支持255个字符)