我有一个名称空间,公开与公共数据相关的函数(get-images
,insert-user
).然后,我有两个具有相同功能的数据库后端,并以不同的方式实现它们.他们实现了接口.每个后端都包含在命名空间中.
我似乎无法找到一个如何实现这一目标的良好解决方案.
我尝试动态加载ns
但没有运气.一旦你这样做(:require [abc :as x])
,这x
不是一个真正的价值.
我试着用defprotocol
和deftype
但这就是各种奇怪的,因为在功能deftype
需要进口,也和这对我弄乱了一切.
这有什么惯用的解决方案吗?
我不明白为什么协议不够用?
在ns data.api中:
(ns data.api)
(defprotocol DB
(get-images [this])
(insert-user [this]))
Run Code Online (Sandbox Code Playgroud)
在ns data.impl1中:
(ns data.impl1
(:require [data.api :refer :all]))
(defrecord Database1 [connection-params]
DB
(get-images [_] ...)
(insert-user [_] ...))
Run Code Online (Sandbox Code Playgroud)
ns data.impl2中的内容相同.
然后,当您使用特定的数据库时,只需创建正确的记录:
(ns data.user
(:require [data.api :refer :all])
[data.impl1 :refer (->Database1)])
(defn use-db []
(let [db1 (->Database1 {})]
(get-images db1)))
Run Code Online (Sandbox Code Playgroud)