我有一个应用程序,可以根据特定的数据存储生成密钥。如果有7个这样的路由和5个应用程序,我的event.clj中总共会有35条路由(或者,如果拆分,7/5个文件中的文件)。我想动态地执行以下操作:
(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)}))
)
这样我可以编写每个路由一次然后传递app-name(而不是在查询参数中传递它,它可以工作,但不是非常RESTful。
奖金
如何动态调用命名空间,以便key-model/build-key
根据应用名称调用redis-model/build-key
或riak-model/build-key
?
答案 0 :(得分:2)
不确定我是否理解这个问题,但这不是你想要的:
(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)}))
奖金
我还将寻找一个简单的解决方案,即使用带有功能的地图生成密钥,例如:
(def key-gen {"redis" redis-model/build-key
"riak" riak/build-key})
(response/json
{:key ((get key-gen app-name) :event key-map)})
如果您真的想要动态查找构建密钥功能,可以执行以下操作:
(defn build-key [app-name]
(let [the-ns (symbol (str app-name "-model"))]
(require the-ns)
(ns-resolve the-ns 'build-key)))