2009-06-09 11 views
1

asp.net mvcでいくつかのチュートリアルを行った後、リポジトリパターンが現れ、例は1つのテーブル、ディナーテーブルでした。基本的には、インターフェイスを作成し、その後コントローラクラスのインターフェイスからインターフェイスとプログラムを実装する具体的なクラスを作成することでした。インターフェイスには、一般的な方法があります。このパターンを使用する場合は、各タイプのインタフェースを作成する必要があります。たとえば、ディナータイプのGetListメソッドがありました。あなたは、厳しい機能を実行するために必要な10種類のタイプがある場合はどうなりますか?これは、10の具体的なクラスと10のインターフェイスを意味するだけの利点は、db技術を切り替えることができるのですか? このパターンを標準の3層アーキテクチャ(オブジェクト層、ビジネスロジック層、データアクセス層)に適用する方法を理解しようとしています。リポジトリパターンと依存性注入の詳細な例が必要

ありがとうございました。

答えて

7

これは私の実装で通常行う方法です。

基本的なCRUD構造を定義するIEntityRepositoryという汎用インターフェースです。私の実装では、私は、以下のメンバーを定義:

  1. 挿入
  2. 更新
  3. 検索(この1は、構築するために述語ビルダーを使用しているGETALL
  4. をGetPagedゲット
  5. を削除します。 where句)

IEntityRepositoryを継承する別のIMyentityRepositoryインターフェイスを作成します。これにより、エンティティ固有のメンバーを追加して、必要なときにDIを使用できるようになります。私は次に、IMyentityRepositoryを継承し、すべてのメンバーを実装する密封クラスMyentityRepositoryを作成します。

依存性注入を使用すると、具体的なタイプのMyentityRepositoryに対してインターフェース(IMyentityRepository)を登録できます。

私の場合、私は実際には行われませんでした。リポジトリの上にサービスレイヤを作成してカプセル化し、より一般的な方法で公開しました。たとえば、単純にデータベースレコードを作成するよりも多くの作業を必要とするユーザーのアカウントを作成したいとします。あなたのサービスでは、その実装で複数のリポジトリメンバーを呼び出すCreateUser()というメンバーがあります。 私のサービスレイヤーは、私のレポジトリレイヤーと同じもので構築されています。共通のCRUDメンバーのIEntityService、エンティティ固有のメンバーのIMyentityService、実装のためのMyentityServiceがあります。 MyentityServiceクラスにはIMyentityServiceのインスタンスが必要です(IoCフレームワークを選択して注入できます)。サービスレイヤでは、検証やビジネスロジックも実行できます。私はコントローラで検証を行います。まあ、技術的には、私はそれを私のコントローラに呼び出すと、私はModelStateに書き込むことができます結果を取得します。

ほんの少し役に立ちました。

2

これは、あなたが探しているものより少し複雑かもしれませんが、S#arp ArchitectureのサンプルNorthwindアプリをチェックアウトすることができます。

リポジトリはNorthwind.Coreプロジェクトにあります。

また、リポジトリとDIを使用する利点は、将来のある日に基礎となるデータベーステクノロジを切り替えることができないためです。むしろ、あなたが依存しているクラスのテストでサービス(インターフェースで定義されている)を模造し、偽装することができるユニット・テストを書くことができます。

0

テーブルごとに一意のリポジトリクラスを使用する場合と、テーブルごとに使用できるCRUDメソッドを使用して汎用IRepositoryクラスを作成するかどうかは、あなた次第です。

これは決定しようとしたとき、私は尋ねる質問のようなものです:

「すべてのリポジトリのサポートは、更新を読み取りを作成し、削除しますか?」

自分のインターフェースがより明示的になるようにカスタムリポジトリクラスを使用することを選択しました。たとえば、挿入、更新、削除を許可していない参照データテーブルがあります。これらのテーブルのリポジトリには、Getメソッドのみが含まれています。これは私にクリーンなデザインを提供しますが、もう少し作業を要します。

+0

インターフェイスを作成してから、それらのリポジトリを取得する具体的なクラスを作成していますか? – TampaRich

+0

はい。ユニットテストとIoCが簡単になります。 –