リポジトリのパターンをたくさん聞いたことがありますが、リポジトリが実際に何をするべきか私はまったく理解していませんでした。 「リポジトリが実際に何をすべきか」と言うとき、私は主にそれが提供すべきメソッドについて心配しています。たとえば、リポジトリは実際にCRUDメソッドを提供する必要がありますか、それともいくつかの異なる種類のメソッドを提供する必要がありますか?
つまり、リポジトリにはビジネスロジックが含まれているのか、それともデータストアと通信して保存またはロードされるエンティティを管理するロジックが含まれているだけなのか。
また、リポジトリは集約の永続化の単位であると聞いたことがあります。しかし、それはどうですか?これが実際にどのように機能するのか理解できません。 CRUDメソッドを含むインターフェースIRepository
は1つだけにすべきだと思ったので、どのエンティティでも、実装には、データストアからそのような型を保存および取得するロジックが含まれているだけです。
さて、リポジトリのコンセプトに基づいた Spring Data Framework で良い例を見ることができます。
リポジトリはデータストアのみを扱い、ビジネスロジックはほとんど含まれていません(これはサービスレイヤー用に予約されています)。そのため、たとえば、エンティティの作成、破棄、および回復のためのメソッドを公開する CRUDRepository インターフェースを持っていることがわかります。 PagingAndSortingRepository もあり、正確にそれを行うための追加機能、ソート、ページング結果などを追加します。
したがって、このフレームワークは、優れたリポジトリー設計を検討するのにおそらく最適な場所です。
私の知る限り、Spring Data Frameworkによって実装された概念の多くは、 ドメイン駆動設計:ソフトウェアの心臓部における複雑性への取り組み と呼ばれる素晴らしい本から来ています。リポジトリ設計へ。
あなたはそれのコピーを取得することを検討するかもしれません。
本からの小さな抜粋は説明します:
REPOSITORYパターンは、これらのソリューションをカプセル化し、モデルに焦点を戻す単純な概念フレームワークです。
REPOSITORYは、特定のタイプのすべてのオブジェクトを概念セット(通常はエミュレート)として表します。より複雑なクエリ機能を除いて、コレクションのように機能します。適切なタイプのオブジェクトが追加および削除され、リポジトリの背後にある機構がそれらをデータベースに挿入またはデータベースから削除します。この定義には、ライフサイクルの初期から終わりまで、AGGREGATESのルーツへのアクセスを提供するための一連の責任がまとまります。
クライアントは、クライアントが指定した基準(通常は特定の属性の値)に基づいてオブジェクトを選択するクエリメソッドを使用して、リポジトリにオブジェクトを要求します。 REPOSITORYは、要求されたオブジェクトを取得し、データベースクエリのメカニズムとメタデータマッピングをカプセル化します。 REPOSITORIESは、クライアントが必要とする基準に基づいてオブジェクトを選択するさまざまなクエリを実装できます。また、いくつかの基準を満たすインスタンスの数などの要約情報を返すこともできます。それらは、いくつかの数値属性のすべての一致するオブジェクト全体の合計など、要約計算を返すこともできます。
REPOSITORYはクライアントから大きな負担を取り除きます。クライアントは単純な意図を明らかにするインターフェースと対話し、モデルの観点から何が必要かを尋ねることができます。これらすべてをサポートするには、多くの複雑な技術インフラストラクチャが必要ですが、インターフェイスはシンプルであり、概念的にはドメインモデルに接続されています。
したがって:
グローバルアクセスが必要なオブジェクトのタイプごとに、そのタイプのすべてのオブジェクトのメモリ内コレクションのように見えるオブジェクトを作成します。よく知られたグローバルインターフェイスを介してアクセスを設定します。
データストアでのデータの実際の挿入または削除をカプセル化するオブジェクトを追加および削除するメソッドを提供します。いくつかの基準に基づいてオブジェクトを選択し、属性値が基準を満たすオブジェクトの完全にインスタンス化されたオブジェクトまたはコレクションを返すメソッドを提供して、実際のストレージおよびクエリ技術をカプセル化します。実際に直接アクセスする必要があるAGGREGATEルートにのみリポジトリを提供します。クライアントをモデルに集中させ、すべてのオブジェクトストレージとリポジトリへのアクセスを委任します。
ストレートCRUDインターフェイスもビジネスロジックも提供しません。ビジネスロジックとデータベースの間を仲介します。インターフェースはビジネスロジック用語である必要がありますが、ビジネスロジック自体を実行するのではなく、ビジネスロジックプリミティブに似ています。例として、電子メールシステムを構築するとします。ユーザーとメッセージがあります。リポジトリは、ユーザーとメッセージに基本的なCRUD操作を提供しますが、GetUsersNewMessages(user)やGetSearchedMessages(user、searchTerms)などのメッセージのフィルタービューも提供します。
この考え方は、リポジトリがストレージの実装方法を隠し、データへの柔軟な高速アクセスを可能にするクリーンなインターフェースを提供するというものです。操作をどのように行うかではなく、何をすべきかという高いレベルで操作を維持することは、基盤となるバッキングストアに最適な方法で操作を実装するための柔軟性が高まることを意味します。