DI или Service Locator: внедрение реализаций во время выполнения (без статической привязки) в Scala

У меня есть случай использования, в котором я хотел бы предложить простой API для расширения функциональности моего приложения Scala.

Я потратил последние пару дней, пытаясь найти инфраструктуру или библиотеку java/scala DI, которая делает для меня следующее:

  1. определяет реализации интерфейса / черты на пути к классам
  2. создает и внедряет указанные реализации (важная особенность: все они) в сайт, помеченный, предпочтительно с аннотацией
  3. вышесказанное не может произойти в компиляторе, потому что мне нужна архитектура плагинов, где плагины не вводятся до запуска JVM
  4. следовательно, вышеописанное может произойти при запуске JVM (горячая замена не требуется)

Я все больше и больше тяготею к OSGi DS, которой я большой поклонник, за исключением того, что я считаю это излишним из-за #4.

Я посмотрел на Guice, Weld, Scaladi и MacWire, и не мог сразу увидеть простой способ сделать это. Моя цель состоит в том, чтобы авторы "плагинов" вообще не знали о моем решении для инъекций /IoC, за исключением случайных аннотаций (предпочтительно JSR330) в месте инъекции, я готов иметь дело с более уродливыми вещами.:-)

Придется ли мне использовать здесь собственное решение, использовать OSGi или мне не хватает чего-то тривиального в вышеупомянутых библиотеках?

PS: я пытаюсь держаться подальше от OSGi, главным образом, из-за его взаимодействия с прикладной средой, которую я использую (akka - не уверен, что жизненный цикл связки /DS хорошо сочетается с единой системой акторов)

3 ответа

Решение

Если вы можете себе это позволить, вероятно, лучше (не только для вас, но и для всей экосистемы) согласиться с предложением Питера.

Прагматично говоря, у Java есть SPI, который идет OOTB и может быть самым простым способом пойти в вашем конкретном случае.

Я смотрю на то, какие функции предоставляет Scaldi в данный момент. Я нашел это достаточно зрелым. Поэтому нет ничего сложного в использовании этой библиотеки DI для достижения ваших целей. Например, вы можете реализовать только код для поиска, специально аннотированный / указанный в каком-либо файле конфигурации или чем-то еще.

Если вам нравится DS (и он, кажется, в высшей степени подходит для вашей проблемы), то почему бы не решить проблемы с Akka? Я уверен, что другие будут готовы помочь, так как это выглядит как интересная комбинация.

Другие вопросы по тегам