首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确绑定同一服务的多个实现?

如何正确绑定同一服务的多个实现?
EN

Stack Overflow用户
提问于 2015-08-31 15:09:27
回答 2查看 731关注 0票数 3

我有服务类:Service及其含义:RedisServiceImpl, DBServiceImpl

在我的应用程序中,几乎每个类都必须使用这两个隐式来更新字段。我想用Guice注入这些服务。

代码语言:javascript
运行
复制
class ServiceModule extends AbstractModule with ScalaModule {

    override def configure(): Unit = {
        bind[Service].annotatedWith(Names.named("Redis")).toInstance(new RedisServiceImpl("localhost"))
        bind[Service].annotatedWith(Names.named("DB")).toInstance(new DBServiceImpl("some external host"))
    }
}

这方面的问题是,如果我们移开redis/db,我将不得不遍历所有类,并将"Redis"/"DB"替换为新名称。有更简单的方法吗?

我试图在ServiceModule中创建常量,但是当我试图将服务注入一个类时,我得到了以下错误:

代码语言:javascript
运行
复制
Error:(18, 34) annotation argument needs to be a constant; found: modules.ServiceModule.x
          , @Named(ServiceModule.x) redisService: Service
                             ^

下面是我要加入的课程:

代码语言:javascript
运行
复制
class Poller @Inject()(
        @Named("PollService") pollService: PollService[List[ChannelSftp#LsEntry]]
      , @Named("Redis") redisStatusService: StatusService
      , @Named("DB") dynamoDbStatusService: StatusService
) {
  ... methods ...
}

如果我试过:

代码语言:javascript
运行
复制
class Poller @Inject()(
        @Named(ServiceModule.x) pollService: PollService[List[ChannelSftp#LsEntry]]
      , @Named("Redis") redisStatusService: StatusService
      , @Named("DB") dynamoDbStatusService: StatusService
) {
  ... methods ...
}

我得到了上面提到的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-31 17:15:39

这就是问题所在,在Poller而不是您的Guice模块中:

代码语言:javascript
运行
复制
     @Named(ServiceModule.x) pollService: PollService[List[ChannelSftp#LsEntry]]

注释参数必须是常量,正如它在错误消息中所述:

代码语言:javascript
运行
复制
Error:(18, 34) annotation argument needs to be a constant; found: modules.ServiceModule.x
      , @Named(ServiceModule.x) redisService: Service

您似乎遇到了与这个问题相同的问题:Best practice for use constants in scala annotations;尝试使ServiceModule.x成为最终问题。

票数 4
EN

Stack Overflow用户

发布于 2015-09-03 15:51:20

如果我能建议:重新思考你意识到的模式:责任链,也许是访客或装饰者。它们不同地触发了多少个实现(首先,ChoR停止,成功等,命令不受限制的或具体的)。我看到了不同的方式来实现不同的模式。

PS。我不是设计模式的虔诚者,也不是因为方法名“next()”或其他原因而产生的圣战。我可能有类似的问题: 2/3的数据源: JAR资源,文件系统,Guice通过本地决策配置的数据库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32314411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档