4

clojure を初めて使用するので、リポジトリ パターンの実装についてアドバイスをお願いします*。

OO 言語では、リポジトリ インターフェイス、テスト、および少なくとも 1 つの db impl を作成します。ブートストラップ中にそれらをインスタンス化し、DI を使用してオブジェクトを渡したり、サービス ロケーターを介してオブジェクトを取得したりします。clojureではまったく違うことをしていると思いますか?

1) レポ内の関数をグループ化する良い方法は何ですか? プロトコル、名前空間の「無料」機能?

2) レポジトリ バックエンドをインスタンス化する場所、つまり、db 接続などのリソースを割り当てる場所は? リポジトリ プロトコルの実装をインスタンス化してアトムに割り当てますか、それともフリー関数の場合は再定義しますか?

*) リポジトリは永続化のためのバックエンドの抽象化であり、通常は CRUD スタイルの操作範囲をサポートします。

編集:これが私が現在使用しているアプローチです。機能をグループ化するためのプロトコル。テストとそれを実装した「実際の」記録。次に、レポを登録するアトム。

(defprotocol GardenRepo
  "Repository of Gardens. Supports CRUD style operations."
  (list-gardens [repo] "Get a seq of all gardens in the repo.")
  (get-garden [repo id] "Get a specific garden by it's id.")
  ...)                                                                

(let [repo (atom nil)]
  (defn get-garden-repo [] @locator)
  (defn set-garden-repo [new-repo] (reset! repo new-repo)))
4

1 に答える 1