Component with Compojure
Долгое время задавал себе вопрос изоляции внешних зависимостей в Clojure. Чувствовал что чего то не хватает. Время шло, а этот вопрос местами грыз меня.
Где то в 2013 блуждая в интернете увидел презентацию Clojure in the Large. В ней частично затрагивалась данная проблема, но полностью решение найдено не было. Вопросов появилось больше чем ответов.
Весной 2014 в скайп прилетела ссылка Stuart Sierra - Components Just Enough Structure, в ней расскажзывалось про Component и она вселила надежду.
Начали использовать Component в проекте, и все было хорошо. Пока не наступил момент интеграции Compojure с Component. Возникли проблемы, они конечно решались, но кода было как то слишком много.
Решив уменьшить количество кода, упростить понимание и сделать мир лучше сделал макрос цель которого принять на себя боль интеграции Compojure с Component.
Макрос выделил в отдельную библиотеку, назвал ее comcomp.
Теперь компонент с роутами можно описать вот так:
(defroutes-with-deps
RoutesComponent ; <- Component name
[first-dep second-dep] ; <- Dependency list.
(GET "/hello" [] (some-func first-dep)) ; <- Routes spec
(POST "/word" [] (some-second-func second-dep))) ;You can use
;previously defined
;dependencies