我有一个应用程序,可以根据特定数据存储生成 key 。如果有 7 条这样的路线和 5 个应用程序,则我的 event.clj 中总共将有 35 条路线(或者,如果拆分,则为 5 个文件中的 7 个/文件)。我想动态地执行以下操作:
(defnested "/:app-name"
(defpage "/generate/event" {:keys [app-name event-name time] :as key-map}
(response/json
{:key (key-model/build-key :event key-map)}))
(defpage "/generate/event/unread" {:keys [app-name event-name] :as key-map}
(response/json
{:key (key-model/build-key :unread-for-event key-map)}))
)
这样我就可以编写每个路由一次,然后传递应用程序名称(而不是在查询参数中传递它,这可以工作,但不是很 RESTful。
奖金
如何动态调用命名空间,以便 key-model/build-key
成为对 redis-model/build-key
或 riak- 的调用model/build-key
基于应用程序名称?
最佳答案
不确定我是否理解这个问题,但这不是您正在寻找的:
(defpage "/:app-name/generate/event" {:keys [app-name event-name time] :as key-map}
(response/json
{:key (key-model/build-key :event key-map)}))
(defpage "/:app-name/generate/event/unread" {:keys [app-name event-name] :as key-map}
(response/json
{:key (key-model/build-key :unread-for-event key-map)}))
奖金
我还将寻求一个简单的解决方案,即使用带有函数的映射来生成 key ,例如:
(def key-gen {"redis" redis-model/build-key
"riak" riak/build-key})
(response/json
{:key ((get key-gen app-name) :event key-map)})
如果你确实想动态查找构建 key 函数,你可以这样做:
(defn build-key [app-name]
(let [the-ns (symbol (str app-name "-model"))]
(require the-ns)
(ns-resolve the-ns 'build-key)))
关于clojure - 黑巢路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629265/