我有一个公开常见数据相关函数的命名空间(get-images
, insert-user
)。然后,我有两个具有相同功能并以不同方式实现它们的数据库后端。他们按原样实现接口。每个后端都包含在一个命名空间中。
我似乎无法找到如何完成此任务的良好解决方案。
我尝试动态加载ns
但没有运气。一旦你这样做了(:require [abc :as x])
, the x
不是真正的值。
我尝试使用defprotocol
and deftype
但这很奇怪,因为deftype
也需要进口,这让我的一切都变得混乱。
有一些惯用的解决方案吗?
我不明白为什么协议还不够?
在 ns data.api 中:
(ns data.api)
(defprotocol DB
(get-images [this])
(insert-user [this]))
在 ns data.impl1 中:
(ns data.impl1
(:require [data.api :refer :all]))
(defrecord Database1 [connection-params]
DB
(get-images [_] ...)
(insert-user [_] ...))
ns data.impl2 中也有同样的事情。
然后,当您要使用特定数据库时,只需创建正确的记录:
(ns data.user
(:require [data.api :refer :all])
[data.impl1 :refer (->Database1)])
(defn use-db []
(let [db1 (->Database1 {})]
(get-images db1)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)