web-dev-qa-db-ja.com

リポジトリパターンとDALオブジェクトの作成

私が学んだ限り、IRepositoryにはCRUDが含まれているはずです。次に、IRepositoryのような他のインターフェイスでこのIProductを継承し、IProductconcreteクラスProductRepositoryGetAllProducts()Top5Products()

N層アーキテクチャでも同じことができます。のように、_DAL Class Library_を作成し、その中でGetAllProducts()Top5Products()などのメソッドを使用してクラスProductを定義します。

_DAL.Product_クラスと_Repo.ProductRepository_クラスの両方で、_DB Context_の_Entity Framework_を初期化し、関連データをクエリします。

呼び出しは、BLLの_Repo.ProductRepository_または_DAL.Product_メソッドの両方で類似しています

これらの類似点を考慮して、私の質問はレポの利点は何ですか? (Controller、_BLL Class Library_、_DAL Class Library_)を使用したn層アーキテクチャを使用すると、同じように簡単に同じことができます。

9
M. Arslan

私の理解は:

  • [〜#〜] dal [〜#〜](データアクセスレイヤー)は、ソフトウェアのレイヤーを指します永続化テクノロジとアプリケーションロジックの間。その目的は、データアクセスの問題を他のアプリケーションの問題と区別することです。 generalの概念です。

  • Repositoryは、DDD(ドメイン駆動設計)のコンセプトです。

DDDでは、Repositoryは、特定のAggregateのすべてのデータアクセスの懸念をカプセル化する責任があります。これには、Aggregateの読み取りおよび書き込み中に一貫性を確保する責任が伴います。また、Aggregateは関連するエンティティのグループです(例:ProductStoreなど)。

したがって、リポジトリは具体的には集約の永続性と一貫性の問題を認識しています。 generalDALは、specificリポジトリで構成される可能性が高い

TL; DR;

  • [〜#〜] dal [〜#〜]は、データアクセスの問題を抽象化するための一般的な用語です。
  • RepositoryはDDDからの類似した、しかしより具体的な概念です。
  • DALは複数のリポジトリで構成される可能性があります。
7
MetaFight

2つの異なる補完的な概念を比較しています:

  • データアクセスレイヤー は、データへのアクセスを抽象化することを目的としたアーキテクチャレイヤーです。アクセスをどのように抽象化するかについては触れていません。
  • Repository は、DALに属する特定のパターンです( this link の末尾にあるパターンのリストを参照してください)。これは、データへの特定のアクセスを抽象化する方法を正確に示しています。データストアへのインターフェイスのようなコレクションを提供することによって。

例のDAL

興味深いことに、クラスライブラリの例では、DAL.Productはリポジトリのようです。したがって、実際には違いが見られないのは正常です。実装の観点からは、同じです(この特定の場合)。
しかし、そうする必要はありません。 DALは、たとえば次のように異なる方法で実装できます。

  • アクティブレコード データベース抽象化レイヤーに依存します。
  • 貧血ドメインオブジェクト (注意、アンチパターン!) 行データゲートウェイ から取得
  • または、なぜそうでないのか、各クエリがオブジェクトを取得する特定の方法を実装する、異なるクエリオブジェクトから取得されたドメインオブジェクト
  • リポジトリ
  • それらすべてのミックス

リポジトリの違い

リポジトリの概念は、アーキテクチャモデルと実装には依存しません。レイヤーやデータベースを考える必要はありません。ドメインを設計するときに知っておく必要があるのは、オブジェクトが、永続性を提供する特別な種類のコレクションであるリポジトリにあるということだけです。これはそれらをドメイン設計に非常に適しており、なぜそれらが ドメイン駆動設計 の重要な要素であるかを説明します。

DDDでは、リポジトリにはいくつかのルールがあります。これらは、アグリゲート(独立したエンティティ、またはアグリゲートルートに依存する関連エンティティのグループ)へのアクセスを提供し、アグリゲートごとに1つのリポジトリがあります。

2
Christophe