2015-08-31 3 views
3

У меня есть класс обслуживания: Service и его плечи: RedisServiceImpl, DBServiceImpl.Как правильно привязать несколько реализаций одной и той же службы?

В моем приложении почти каждый класс должен использовать эти два модуля для обновления полей. Я хочу использовать 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/дб, я должен был бы рыскать по всем классам и заменить "Redis"/ с новыми именами. Есть ли более простой способ сделать это?

Я попытался создать константы внутри из 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 ... 
} 

я получаю ошибку я уже упоминал выше.

ответ

4

Это проблема, в 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 финал.

1

Если я могу предложить: переосмыслить, какой образ вы осознаете: Цепь ответственности, возможно, посетителя или декоратора. Они отличаются тем, сколько реализаций запущено (остановка ChoR при первом успешном и т. Д., Порядок неограничен или конкретный). Я видел разные способы Guice для реализации разных шаблонов.

PS. Я не религиозный фанат паттернов дизайна, никаких священных войн из-за имени метода «next()» или другого и т. Д. У меня может быть одна и та же проблема: 2/3 источник данных: ресурс JAR, файловая система, база данных, настроенная Guice местное решение

Смежные вопросы