Hello all, I am playing with the idea of a little library for dependency injection. The idea is to declare injectable values as metadata-to-function map. I started with a sketch of what the client code may look like.
Please let me know what you think. Thank you, Boris Dependency declaration code: ;; ------------------------------------- ;; declare lookup functions (def-inject #^{:type String :name "password"} password-lookup-fn #^{:a 1 :b 2} a1-b2-lookup-fn ....) ;; utility wrapper functions that allow for caching, lazy initializations etc ... (def-inject #^{:type JDBC :kind "mysql"} (lazy (once-per-thread mysql-connect)) #^{:type JDBC :kind "oracle"} (lazy (once-per-thread oracle-connect))) Client code: ;;------------------------------------------------- ;; a function that has access to password, foo and bar in it's lexical scope ;; dependencies are bound when the function is called (inject #^{:name "password" } password #^{:a 1 :b 2} foo #^{:type t2 :p1 v1 :p2 v2} bar (defn fn-with-foo-bar-injected..... )) ;; overriding injected values - e.g. for unit testing (inject-bind foo foo-val bar bar-val (fn-with-foo-bar-injected ..... )) ;; injecting a value inline ;; the name foo is provided for inject-bind (defn ..... (... (inject #^{:type t :param1 v1 :param2 v2} foo) ...) ...) ;; local scope injections - works like let (inject #^{:type t :param1 v1 :param2 v2} foo (...code that can use foo...)) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en