требовать все пространства имен по префиксу

У меня есть приложение, которое можно расширить с помощью defmethod вызовов. Приложение должно быть расширено во время выполнения путем добавления новых пространств имен в путь к классам, которые содержат дополнительные вызовы defmethod.

Я ищу решение для внедрения зависимостей. Возникает вопрос: как мое приложение узнает, какие пространства имен ему следует require использовать, чтобы вызовы defmethod могли действовать?

  1. Одним из решений является наличие центрального файла конфигурации, содержащего имена пространств имен, которые могут потребоваться. Недостатком является то, что мне нужно редактировать конфигурации вручную, когда я хочу включить плагин.

  2. Другой способ — каким-то образом динамически сканировать путь к классам на наличие дополнительных пространств имен и запрашивать их на основе предиката (например, префикса имени пространства имен).

Я нашел только эти два решения, но мне интересно, какие еще могут быть способы внедрения зависимостей во время выполнения в Clojure. И какие библиотеки обычно используются для этой цели?

Заранее спасибо.


person erdos    schedule 21.11.2018    source источник
comment
Что вы имеете в виду, говоря, что у меня есть приложение, которое можно расширить с помощью вызовов defmethod? Вы определили defmulti, для которого пользователи могут создавать методы?   -  person Carcigenicate    schedule 22.11.2018
comment
Да, приложение имеет несколько мультиметодов в своем основном конвейере, и пользователям следует расширять функциональность с помощью вызовов defmethod.   -  person erdos    schedule 22.11.2018
comment
Почему ваше приложение должно требовать пространства имен? Пользователей, реализующих метод, должно быть достаточно, если только я не понимаю, что вы пытаетесь сделать.   -  person Carcigenicate    schedule 22.11.2018
comment
Я предполагаю, что это в основном вопрос о том, как загружать пользовательский код (плагины), что бы этот код ни делал.   -  person Svante    schedule 22.11.2018


Ответы (1)


В Clojure обычно используются 3 фреймворка внедрения зависимостей:

Из них Integrant, вероятно, лучше всего соответствует вашему образу мышления. Однако в прошлом я думал, что у меня была проблема, которую вы описываете, и я сканировал пространства имен, которые требуют обязательного подхода. Но в свое время я понял, что я структурировал код неоптимальным образом, и, думая об этом по-другому, код стал проще для понимания и в то же время устранил эту проблему обратной зависимости. Ваша ситуация вполне может быть другой. Хотя поиск пространств имен для загрузки работает;)

person l0st3d    schedule 22.11.2018