比方說,我有一個超級簡單的用戶註冊檢查,用戶的電子郵件在所有用戶中必須是唯一的。如何從持久層分離唯一性驗證?
我已經在這些功能中表達了這個要求。
(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。感覺就像這種依賴破壞了將業務邏輯層與持久層分離的整個概念。所以我正在尋找解釋如何正確地做到這一點的心態,或者爲什麼它不能完成。
你打算以後插入用戶?如果是的話,那麼你就必須使用這種方法的競爭條件。 (除非你保留在內存中,並鎖定所有電子郵件)。 – ClojureMostly
您是Ruby開發人員,所以我想我應該提醒您[Rails唯一性驗證指南的這一部分](http://guides.rubyonrails.org/active_record_validations.html#uniqueness)。本節的一部分仍然適用於Clojure。 –