2

特定のデータストアに基づいてキーを生成するアプリがあります。そのようなルートが 7 つとアプリが 5 つある場合、私の event.clj には合計 35 のルートがあります (または、分割されている場合は、5 つのファイルに 7/file)。次のことを動的に実行したいと思います。

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

そうすれば、各ルートを 1 回記述してから、app-name を渡すことができます (クエリ パラメーターで渡すのではなく、機能しますが、あまり 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 に答える