gpt4 book ai didi

dependency-injection - 将状态作为参数传递给环处理程序?

转载 作者:行者123 更新时间:2023-12-03 23:30:07 24 4
gpt4 key购买 nike

如何最方便地将状态注入(inject)环处理程序(不使用全局变量)?

这是一个例子:

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

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

我想得到 the-state进入 main-routes 的复合处理程序.状态可能类似于使用以下内容创建的 map :
(defn create-app-state []
{:db (connect-to-db)
:log (create-log)})

在非环形应用程序中,我将在主函数中创建状态并开始将其或其中的一部分作为函数参数注入(inject)到应用程序的不同组件中。

可以用环的 :init做类似的事情吗?函数不使用全局变量?

最佳答案

我已经看到这有几种方法。第一种是使用中间件,将状态作为新键注入(inject)到请求映射中。例如:

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

(defn app-middleware [f state]
(fn [request]
(f (assoc request :app-state state))))

(def app
(-> main-routes
(app-middleware (create-app-state))
handler/api))

另一种方法是将调用替换为 defroutes ,它将在幕后创建一个处理程序并将其分配给一个 var,该函数将接受一些状态,然后创建路由,将状态作为参数注入(inject)路由定义中的函数调用:
(defn app-routes [the-state]
(compojure.core/routes
(GET "/api/fu" [] (rest-of-the-app the-state))))

(def app
(-> (create-app-state)
app-routes
api/handler))

如果可以选择,我可能会采用第二种方法。

关于dependency-injection - 将状态作为参数传递给环处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19776462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com