web-dev-qa-db-ja.com

リポジトリパターンを正しく使用していますか?

データベースからデータを取得するために、-repositoryのサフィックスが付いた一連の個別のクラスを使用しています。テーブルごとに独自のリポジトリ。

たとえば、顧客を取得するためのすべての種類のメソッドを持つcustomerrepositoryクラスと、空席を取得するためのすべての種類のメソッドを持つvacancyrepositoryがあります。

この方法について2つの質問があります。

  1. 複数のテーブルにまたがるデータを取得するのはどうですか?たとえば、まだ空席を作成していないすべての顧客を表示する画面があります。 customerrepositoryvacancyrespositoryからのメソッドを使用できますか、または両方のリポジトリが結果を返し、結果を取得する階層の上位にクラスがあります(名前をdataserviceとします)。両方のリポジトリから、それらを1つの結果に結合しますか?

  2. そのようなリポジトリはどれだけのロジックを処理できますか?
    私はリポジトリに 'where active == true'を実装してアクティブなレコードのみを取得することは問題ないと思います。または、単純なロジックでさえ、階層の上位のクラスで処理する必要があります(名前をdataservice)?

私が今実行している例はこれです:

1つ以上の質問を含む質問リストがあります。
質問には結果が含まれる場合があり、別のテーブルに保持されます。
そのため、質問リストの合計結果を取得する場合は、questionlistテーブル、質問テーブル、およびquestionstatusテーブルのデータを組み合わせる必要があります。

現在、これらのテーブルには3つの異なるリポジトリがあります。

リスト番号12の合計結果をquestionlistrepositoryに尋ねると、他の2つのリポジトリからデータを取得する必要があり、そのためいくつかのロジックが必要になりますが、それは許可されますか?

または、使用するリポジトリを知っているquestionlistdataserviceはありますか?

もう1つ:リポジトリでIQueryableを生成できるため、呼び出し元のサービスで結果を簡単に組み合わせることができますが、そうでない場合は、すべてのコンテンツを取得することはお勧めしません。データベースの3つすべてのテーブルの。

15
Michel

Repository はドメインオブジェクトを返し、マッピングレイヤーの上に構築されます。非常に単純なドメインの場合、ドメインオブジェクトとデータベーステーブルはほとんど同じです。

リポジトリが常にデータ構造の正確な表現を返す場合、それは実際には Table Data Gateway 別名データアクセスオブジェクト(DAO)である可能性があります。

例:データベースには、個人と住所のテーブルがあります。アプリケーションのドメインアドレスは、それ自体のエンティティではなく、単にPersonのプロパティです。この場合、PersonRepositoryとAddressRepositoryはありません。あなただけのPersonRepositoryがあります。ドメインは、ドメインデータがどのように保持されるかを気にする必要はありません。これらの責任は、リポジトリの背後にあるレイヤーにあります。

あなたの例から、あなたは実際にDAOを持っていて、それらにRepositoriesという名前を付けたようです。

15
simoraman