gpt4 book ai didi

scala - 如何正确绑定(bind)同一服务的多个实现?

转载 作者:行者123 更新时间:2023-12-04 15:54:33 24 4
gpt4 key购买 nike

我有服务类:Service 及其实现:RedisServiceImpl、DBServiceImpl

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

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 中创建常量,但是当我尝试将服务注入(inject)类时出现以下错误:

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

这是我要注入(inject)的类:

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 ...
}

我收到上面提到的错误。

最佳答案

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

     @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

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

关于scala - 如何正确绑定(bind)同一服务的多个实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32314411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com