- Add FactoryDescription protocol (#33) This release's headline feature allows you to fully inspect your system as data. If your development process heavily depends on feature flags, it is necessary to test your system. This feature now makes it possible.
- Add better component validation (#39)
- Wrap exceptions during the build process (500179a)
- Lint di.core/with-open as clojure.core/with-open (#34)
- Fixed
di/add-side-dependency
bug (#32)
-
Improved
di/update-key
. It will throw an exception on a non-existent key (#23) -
Improved naming of generated keys in update-key
- Internal refactoring: switched from recursive functions to loop/recur to minimize stack traces in exceptions.
- Missing and circular dependency exceptions now include a stack of keys inside
ex-info
for easier debugging. - Improved key generation: better naming of generated keys in
update-key
. - Increased test coverage to ensure better reliability.
- Updated comparison with Integrant.
di/ns-publics
registry middleware
Use {::di/kind :component}
to mark a component.
A zero arity service are not a component of zero arity function now.
;; v2
(defn schema-component
[{ddl `clickhouse/ddl
ttl "TTL_DAY"
:or {ttl "30"}}]
(ddl ...))
;; v3
(defn schema-component
{::di/kind :component}
[{ddl `clickhouse/ddl
ttl "TTL_DAY"
:or {ttl "30"}}]
(ddl ...))
;; v2
(defn my-service []
(fn []
...))
;; v3
(defn my-service []
...)
Explicitly use (di/ref)
or other factory to refer to a component.
;; v2
(di/update-key `reitit/route-data conj `raw-method/route-data)
;; v3
(di/update-key `reitit/route-data conj (di/ref `raw-method/route-data))
;; v2
(di/update-key `raw-method/methods #(assoc %1 param-name %2) method)))
;; v3
(di/update-key `raw-method/methods assoc param-name (di/ref method))))
The di/fmap
factory constructor was removed.
Use di/derive
instead.
The di/instument
registry middleware was removed. Maybe there will be a rewrited version.
When root had eight dependencies a system with side depencency started up in the wrong order.
Now you can pass a map as the key argument to start many keys:
(t/deftest lookup-test
(with-open [root (di/start {:a `a :b `b})]
(let [{:keys [a b]} root]
(t/is (= :a a))
(t/is (= :b b)))))
With di/env-parsing
middleware, you can add env parsers.
(defn jetty
{::di/stop (memfn stop)}
[{port :env.long/PORT
handler `handler
:or {port 8080}}]
(jetty/run-jetty handler {:join? false
:port port}))
(di/start `jetty (di/env-parsing {:env.long parse-long}))
Now you can define a service with a multimethod:
(defmulti service
{::di/deps [::x]}
(fn [-deps kind] kind))
Now you can pass a vector as the key argument to start many keys:
(with-open [root (di/start [`handler `helper])]
(let [[handler helper] root]
...))
Base version.
Don't use it. I forgot the details.