2

我有一个为特定数据存储生成密钥的应用程序。如果有 7 个这样的路由和 5 个应用程序,那么我的 event.clj 中将总共有 35 个路由(或者,如果拆分,7/file in 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)}))
)

这样我就可以编写每条路由一次,然后传递应用程序名称(而不是在查询参数中传递它,它可以工作但不是很 RESTful。

奖金

如何动态调用命名空间,以便key-model/build-key调用redis-model/build-keyriak-model/build-key基于应用名称?

4

1 回答 1

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)})

如果您真的想动态查找 build-key 功能,您可以执行以下操作:

(defn build-key [app-name] 
   (let [the-ns (symbol (str app-name "-model"))] 
      (require the-ns) 
      (ns-resolve the-ns 'build-key)))
于 2012-09-28T12:01:32.973 回答