我在几个项目中使用 Datomic,是时候将所有通用代码移到一个小型实用程序库中了。
一个挑战是处理共享数据库uri
, 大多数操作都依赖于它,但必须由使用库的项目设置。我想知道是否有一种行之有效的方法来做到这一点。以下是我考虑过的一些替代方案:
uri
库中的符号并将 uri 作为参数添加到访问数据库的每个函数 alter-var-root
更改它,或类似机制,在初始化函数中 *uri*
并覆盖希望小的适配器层中的值,例如(def my-url ...bla ...)
(定义我的乐趣 [args]
(with-datomic-uri my-uri
(应用库/my-fun 参数))
uri
作为库中的原子最佳答案
Stuart Sierra 上次 Clojure/West 做了一个演讲,名为 Clojure in the Large ,处理大型 Clojure 应用程序的设计模式。
其中之一是您描述的问题。
总结有关手头问题的提示:
1 清除构造函数
所以你有一个定义明确的初始状态。
(defn make-connection [uri]
{:uri uri
...}
2 明确依赖关系
(defn update-db [connection]
...
3 更容易测试
(deftest t-update
(let [conn (make-connection)]
(is (= ... (update-db conn)))))
4 更安全的重新加载
(require ... :reload)
将 uri 保存在稍后绑定(bind)的变量中是很常见的,但会引入隐藏的依赖关系,还假设
body
在单个线程上开始和结束。观看谈话,更多关于设计的技巧。
关于clojure - 如何处理需要在其外部设置的库中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683724/