リポジトリパターンで実際に構築する
それでは実際にリポジトリパターンを利用してアプリケーションを構築しましょう。今回は、既にでき上がっている物に手を加えるより、新規で作り直した方が分かりやすいかと思うので、2回と同じ挙動のアプリケーションをリポジトリパターンで作り直します。それだけだと少し物足りないので今回は、前回実装しなかったDeleteメソッドも実装してみたいと思います。
リポジトリパターンの構築は次のポイントになります。
- 対象となるリポジトリインターフェイスの作成
- リポジトリインターフェイスを実装したクラスの作成
- アプリケーションロジック(Controller)への適用
順に解説してきます。
1.対象となるリポジトリインターフェイスの作成
初期設定からViewPageの追加までは第2回とまったく同じですので、第2回目のスキャフォールディングを利用したViewPageの追加と変更まではそちらを参照ください。
確認すると、以下の手順までです。
- プロジェクトの作成(サンプルプロジェクト名はRepositorySample)
- URLルーティングルールの確認・変更
- Controllerクラスの作成
- Modelの作成
- スキャフォールディングを利用したViewPageの追加と変更
それでは、下準備ができたところで、実際にリポジトリインターフェイスの作成を行います。
- ソリューション エクスプローラを展開し、Modelフォルダ上で[新しい項目の追加]を選択。
- 選択後[新しい項目の追加]ダイアログが表示されるので、テンプレートとして「インターフェイス」を選択し、名前を「IPubsRepository.cs」と設定後[追加]ボタンをクリック
インターフェイスには、データの取り扱いに関する定義を定めるので今回は以下の定義を定めます。
using System.Linq; <中略> public interface IPubsRepository { // Titlesエンティティ全取得 IQueryable<titles> FindAllTitles(); // idと一致するレコードを取得 titles GetDetailTitles(string id); // Create時にデータを追加 void Add(titles _titles); // Delete時にデータを削除 void Delete(titles _titles); // データの保存 void Save(); }
実装するメソッドの概要はコメント通りです。FindAllTitlesメソッドだけ、エンティティに対するLINQクエリ結果を列挙するため、IQueryableインターフェイスで定義を行っています。インターフェイスの定義は以上です。
2.リポジトリインターフェイスを実装したクラスの作成
続いてインターフェイスを実装したクラスの作成です。
- ソリューション エクスプローラを展開し、Modelフォルダ上で[新しい項目の追加]を選択。
- 選択後[新しい項目の追加]ダイアログが表示されるので、テンプレートとして「クラス」を選択し、名前を「PubsRepository.cs」と設定後[追加]ボタンをクリック
行っていることは第2回のクエリ式部分を抽出し、それぞれの役割に当てはめているだけです。
using System.Linq; <中略> public class PubsRepository : IPubsRepository { private pubsEntities pubs = new pubsEntities(); // idと一致するレコードを取得 public titles GetDetailTitles(string id) { return pubs.titles.Where(t => t.title_id == id).First(); } // Titlesエンティティ全取得 public IQueryable<titles> FindAllTitles() { return from t in pubs.titles select t; } // Create時にデータを追加 public void Add(titles _titles) { pubs.AddTotitles(_titles); Save(); } // Delete時にデータを削除 public void Delete(titles _titles) { pubs.DeleteObject(_titles); Save(); } // データの保存 public void Save() { pubs.SaveChanges(); } }
エンティティの一覧取得、idと一致するレコードの取得に関しては前回と同様で、特筆すべき点はありません。データの追加と削除はAddTotitlesメソッドとDeleteObjectメソッドを使いパラメタとして渡したレコードをEDMに対して追加、削除しています。続いてEDMからDBへの更新を反映させるSaveChangesメソッドを使い、DBへのレコード更新も行っています。リポジトリクラスの作成は以上です。行うことがシンプルなので全体的にあっさりしていますが、Controllerからデータアクセスロジック部分を抽出できました。