在Clojure Web应用程序中db和路由之间是否存在一定程度的间接?

时间:2016-05-17 13:49:51

标签: clojure architecture

假设我正在做一个Web应用程序,它公开API来获取和改变有关猫的数据。

我正在使用Korma实现我的数据库层,所以会有类似的东西:

(ns kittens.db
  (:require [korma.core :refer :all]))

(defn fetch-cats [db]
  (select cats-table ...))

(defn fetch-cat-by-id [db id]
  (select cats-table
          ...
          (where {:id id})))

(defn create-cat [db data]
  (insert cats-table
          ...))

...
...

我按如下方式实现API路由后:

(ns kittens.routes
  (:require [compojure.core :refer [defroutes GET POST ...]]
            [kittens.db :as db]))

(defroutes cats-routes
  (GET "/cats" [...] (db/fetch-cats ...))
  (GET "/cats/:id" [...] (db/fetch-cat-by-id ...))
  (POST "/new-cat" [...] (db/create-cat ...)))

在这样的实现中,routes模块直接与db模块进行对话,这对我来说似乎不太灵活。它们之间应该有什么东西吗?

1 个答案:

答案 0 :(得分:2)

在我看来,你不需要任何其他东西,这很好。

这样的设置已经非常灵活。

看起来一切看起来都不错,随着事情的发展,这里有一些一般的建议:

避免使用逻辑路径体。 如果路线的主体开始增长,请考虑将其提取到某个功能。 路线测试的乐趣不大。

将您的路由和处理程序中间件共存,除非您需要将这么多路由拆分为上下文。

确保您的处理程序直接引用路由var#'而不是路由,以便重新加载路由。