Clojure 的世界裡,常用的依賴注入 (dependency injection) 手法主要有五種:
- 依賴注入應用於函數 (function)
- 依賴注入應用於命名空間 (namespace)
- 依賴注入應用於攔截器 (interceptor)
- 依賴注入應用於網站處理器 (web handler)
- 依賴注入應用於 Java program 的物件工廠 (factory)
這五種手法都頗為重要:
- 第一種非常的常見,可以算是基本的要求。
- 第二種,在使用 REPL workflow 就會應用到,Luminus 搭配的 mount 就是例子。
- 第三種可以提高程式碼的可讀性、可預測性。因為條件限制 (constraints) 多,可讀性就變好。通常是將 web handler 之後會依賴的 component 透過攔截器注入到 request 裡。
- 第四種可以看成是第三種的變型:在生成 web handler 的時候,注入依賴。
- 第五種則應用於 Clojure/Java interoperation 。當要利用 java library 的時候,有時候既有的 java library 有預留可以注入的 factory pattern 。這時候,如果覺得既有的 java library 不夠好用,想做一些微調整的話,就可以考慮使用 Clojure 的關鍵字 reify 去生成新的 factory 來給 java library 使用。於是,Clojure wrapper 包覆的 java library 就是有微調過的版本。