我將我的應用程序的一部分分成庫在clojure中的應用程序和庫之間的依賴注入
庫函數具有必須由應用程序注入的某些依賴項。我有一個協議爲藍本這個
(defprotocol MyLibDependencies
(some-injected-capability [x]))
(defrecord Foo [y])
(defrecord Bar [y])
(defmulti render-response class)
(defmethod render-response Foo [val] {:ok (some-injected-capability (:y val))})
(defmethod render-response Bar [val] {:err (some-injected-capability (:y val))})
,並在這裏的應用程序,我可以提供一個實現:
(extend-type Object
MyLibDependencies
(some-injected-capability [x] (inc x)))
(comment
(render-response (Foo. 10)) ;; => {:ok 11}
(render-response (Bar. 10)) ;; => {:err 11}
)
這工作,但感覺就像協議的濫用,因爲我既不需要多態分派,注入的函數也不一定需要參數(協議需要至少一個參數來調度它的類)。我有什麼選擇?
請注意,Foo和Bar記錄是庫域類型,而render-response
方法也是庫域。我不一定在意如何定義它們,但它們所代表的抽象是圖書館領域。
而不是注入,使服務器中的所有調用調用協議方法,並讓客戶端提供實現該協議的類型。 – noisesmith 2015-02-11 23:31:25
我不明白這與我有什麼不同,你可以發佈代碼嗎? – 2015-02-12 03:33:23