diff --git a/src/darkleaf/di/core.clj b/src/darkleaf/di/core.clj index 2b2e652e..025c60e0 100644 --- a/src/darkleaf/di/core.clj +++ b/src/darkleaf/di/core.clj @@ -1000,17 +1000,23 @@ (throw (ex-info "A memoized registry should be the first middleware" {:type ::wrong-memoized-registry-position}))) (fn [key] - (let [factory (.computeIfAbsent factories key - (fn [_] - (let [factory (registry key)] - (add-factory-watch factory - #(.remove factories key factory)) - factory)))] - (reify p/Factory - (dependencies [_] - (p/dependencies factory)) - (build [_ deps _add-stop] - (.computeIfAbsent objs [factory deps] - (fn [_] (p/build factory deps add-stop)))) - (description [_] - (p/description factory))))))))) + (let [factory (.computeIfAbsent factories key + (fn [_] + (let [factory (registry key)] + (add-factory-watch factory + #(.remove factories key factory)) + factory))) + description (p/description factory)] + (cond + (::side-dependency description) + factory + + :else + (reify p/Factory + (dependencies [_] + (p/dependencies factory)) + (build [_ deps _add-stop] + (.computeIfAbsent objs [factory deps] + (fn [_] (p/build factory deps add-stop)))) + (description [_] + (p/description factory)))))))))) diff --git a/test/darkleaf/di/memoize_test.clj b/test/darkleaf/di/memoize_test.clj index 70f4593e..0344ac46 100644 --- a/test/darkleaf/di/memoize_test.clj +++ b/test/darkleaf/di/memoize_test.clj @@ -224,6 +224,23 @@ [:stop `invalidation-a]] @log)))) +(t/deftest side-dependency-test + (defn- side-dependency + {::di/kind :component} + [{calls ::calls}] + (swap! calls inc) + :ok) + + (let [calls (atom 0) + mem (di/->memoize {::param :param + ::calls calls} + (di/add-side-dependency `side-dependency))] + (di/start `a mem) + (di/start `a mem) + (t/is (= 2 @calls)) + (di/stop mem))) + + (comment (require '[clj-async-profiler.core :as prof])