Я Расщепление части моего приложения в библиотекуинъекция зависимости между приложением и библиотекой в 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
Я не понимаю, как это отличается от того, что у меня есть, можете ли вы отправить код? –