我在多个项目中使用 Datomic,是时候将所有通用代码移动到一个小型实用程序库中了。
一项挑战是处理共享数据库uri
,大多数操作都依赖于它,但必须由使用该库的项目进行设置。我想知道是否有一种行之有效的方法可以做到这一点。以下是我考虑过的一些替代方案:
丢弃uri
库中的符号并将 uri 作为参数添加到访问数据库的每个函数
通过改变它alter-var-root
,或类似的机制,在 init 函数中
-
将其作为动态变量保存在库中*uri*
并覆盖希望较小的适配器层中的值,例如
(def my-url ...bla...)
(定义我的乐趣 [args]
(带有 datomic-urimy-uri(应用库/my-fun 参数))
Keeping uri
作为库中的原子
去年 Clojure/West 上 Stuart Sierra 做了一个演讲,名为大型 Clojure http://www.infoq.com/presentations/Clojure-Large-scale-patterns-techniques,处理设计模式更大的 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)
Keeping uri在稍后绑定的变量中很常见,但引入了隐藏的依赖关系,还假设body
在单个线程上开始和结束。
观看演讲,了解更多设计技巧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)