作为 clojure 的新手,我想要一些关于实现存储库模式的建议*。
在 OO 语言中,我会创建一个存储库接口、一个测试和至少一个 db impl。我会在引导期间实例化它们,使用 DI 传递对象或通过服务定位器获取它们。我猜它在clojure中完全不同?
1)什么是对回购中的功能进行分组的好方法?协议,命名空间中的“免费”功能?
2) 我在哪里实例化存储库后端,即分配资源,如 db-connections 等?我是实例化存储库协议的实现并将其分配给原子,还是在自由函数的情况下重新定义它们?
*) 存储库是持久性的后端抽象,通常支持 CRUD 风格的操作范围。
编辑:这是我目前使用的方法。对功能进行分组的协议。一个测试和一个实现它的“真实”记录。然后是一个原子来注册回购。
(defprotocol GardenRepo
"Repository of Gardens. Supports CRUD style operations."
(list-gardens [repo] "Get a seq of all gardens in the repo.")
(get-garden [repo id] "Get a specific garden by it's id.")
...)
(let [repo (atom nil)]
(defn get-garden-repo [] @locator)
(defn set-garden-repo [new-repo] (reset! repo new-repo)))