14

状態を最も便利に (グローバル変数を使用せずに) リング ハンドラーに挿入するにはどうすればよいですか?

次に例を示します。

(defroutes main-routes
  (GET "/api/fu" [] (rest-of-the-app the-state)))

(def app
  (-> (handler/api main-routes)))

the-stateの compojure ハンドラに入りたいと思いmain-routesます。状態は、次のように作成されたマップのようなものである可能性があります。

(defn create-app-state []
  {:db (connect-to-db)
   :log (create-log)})

非リング アプリケーションでは、メイン関数で状態を作成し、アプリケーションのさまざまなコンポーネントへの関数パラメーターとして、状態またはその一部を注入し始めます。

:initグローバル変数を使用せずに、リングの機能で同様のことを行うことはできますか?

4

3 に答える 3

-1

これを行う「正しい」方法は、動的にバインドされた var を使用することです。次のように var を定義します。

(def ^:dynamic some-state nil)

そして、各ハンドラ呼び出しの変数をバインドするいくつかのリング ミドルウェアを作成します。

(defn wrap-some-state-middleware [handler some-state-value]
  (fn [request]
    (bind [some-state some-state-value]
      (handler request))))

これを使用して、サーバーを起動する「メイン」関数でこれを使用して依存関係を注入します。

(def app (-> handler
             (wrap-some-state-middleware {:db ... :log ...})))
于 2013-11-04T21:49:04.620 に答える