Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何正确绑定同一服务的多个实现?_Scala_Dependency Injection_Guice - Fatal编程技术网

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

Scala 如何正确绑定同一服务的多个实现?,scala,dependency-injection,guice,Scala,Dependency Injection,Guice,我有服务类:service及其impl:RedisServiceImpl、DBServiceImpl 在我的应用程序中,几乎每个类都必须使用这两个impl来更新字段。我想使用Guice注入这些服务 class ServiceModule extends AbstractModule with ScalaModule { override def configure(): Unit = { bind[Service].annotatedWith(Names.named("

我有服务类:
service
及其impl:
RedisServiceImpl、DBServiceImpl

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

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内部创建常量,但在尝试将服务注入类时出现以下错误:

Error:(18, 34) annotation argument needs to be a constant; found: modules.ServiceModule.x
          , @Named(ServiceModule.x) redisService: Service
                             ^
以下是我正在注入的类:

class Poller @Inject()(
        @Named("PollService") pollService: PollService[List[ChannelSftp#LsEntry]]
      , @Named("Redis") redisStatusService: StatusService
      , @Named("DB") dynamoDbStatusService: StatusService
) {
  ... methods ...
}
如果我尝试:

class Poller @Inject()(
        @Named(ServiceModule.x) pollService: PollService[List[ChannelSftp#LsEntry]]
      , @Named("Redis") redisStatusService: StatusService
      , @Named("DB") dynamoDbStatusService: StatusService
) {
  ... methods ...
}

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

这是问题所在,在
轮询器中
不是您的GUI模块:

     @Named(ServiceModule.x) pollService: PollService[List[ChannelSftp#LsEntry]]
注释参数必须是常量,如错误消息中所述:

Error:(18, 34) annotation argument needs to be a constant; found: modules.ServiceModule.x
      , @Named(ServiceModule.x) redisService: Service

看起来你的问题和这个问题一样:;试着把
ServiceModule.x
做成最终版本。

如果我能建议的话:重新思考你意识到的模式:责任链,可能是访问者或装饰者。它们不同于触发多少个实现(ChoR stop at first successful等,order unrestricted或concrete)。我看到了实现不同模式的不同方式

另外,我不是设计模式的宗教幻影,因为方法名“next()”或其他原因,我没有圣战。我可能有类似的问题:2/3数据源:JAR资源、文件系统、Guice根据本地决策配置的数据库