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