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


14

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

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

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

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

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

私が今遭遇した例はこれです:

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

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

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

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

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


1
通常、複数のテーブルアクセスでは、支配的なテーブルは、クエリがフェッチする前に存在する必要があるレコードのテーブルによって決定されます。LEFT OUTER JOINでは、これが最初の表になり、RIGHT OUTER JOINでは2番目になります。
ニール

回答:


15

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

リポジトリが常にデータ構造の正確な表現を返す場合、実際にはテーブルデータゲートウェイ、つまりデータアクセスオブジェクト(DAO)である可能性があります。

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

あなたの例から、実際にはDAOがあり、リポジトリに名前を付けたように見えます。


そのため、リポジトリを作成するときに、テーブルデータゲートウェイを1レベル深くすることもできます。実際には、レポジトリはTDGです。
ミシェル

1
可能ですが、コストとメリットを比較検討してください。コードの「階層化」の原則によってDAOとリポジトリを分離しておくことにいじめられないでください。この場合、最も読みやすいものを実行してください。分離、および結果として生じる抽象化レイヤーは、リポジトリーがDAO内のデータの多くの再結合を行う傾向がある場合に役立ちます。
ミハイダニラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.