假设我有一个超级简单的用户注册检查,用户的电子邮件必须在所有用户中都是唯一的。
我已经在这些功能中表达了这个要求。
(defn validate-user [user]
(and (:email user) (is-unique? (:email user))))
(defn is-unique? [email]
(not (db-api/user-exists {:email email})))
但我想将我的验证与数据库分离,我想让它完全具有功能性。我也可以将数据库API作为参数注入validate-user
,如
(defn validate-user [db-api user]
(and (:email user) (is-unique? db-api (:email user))))
(defn is-unique? [db-api email]
(not ((:user-exists db-api) {:email email})))
但我不知道这是否是惯用的。
此外,感觉validate-user
的消费者不应该关心数据库api。感觉就像拥有这种依赖性会破坏将业务逻辑层与持久层分离的整个概念。所以我正在寻找一种解释如何正确地做到这一点的思维方式,或者为什么不能这样做。