Итак, ваш вопрос можно обобщить так: Как мне управлять глобальным состоянием в моем приложении.
Есть несколько библиотек, которые помогут вам сделать это:
- component , которая позволяет вам создавать карту глобального состояния, которую вы передаете нужным функциям
- mount , которая позволяет вам создавать что-то похожее на глобальные переменные
- integrant
Вы также можете сделать это без каких-либо специфических c библиотек, используя промежуточное ПО (при условии, что вы используете ring ):
(defn add-db-to-req [handler uri]
(fn [req]
(let [connection (mg/connect-via-uri uri)]
(handler (assoc req :connection connection)))))
Любое промежуточное программное обеспечение, находящееся ниже по потоку от этого, может получить доступ к соединению с помощью
(:connection req)
и передать его нужным функциям.
Как правило, вместо зависимости от глобального состояния, вы захотите передать connection
любой функции, которая зависит от него, как таковая:
(defn fetch-from-database [{:keys [db conn] :as connection} whatever]
...)