C#でリポジトリデザインパターンを実装する方法
デザインパターンは、アプリケーションで繰り返し発生する問題の解決策として使用されます。リポジトリパターンは、最も広く使用されているデザインパターンの1つです。それはあなたのオブジェクトを永続化するでしょう、それらのオブジェクトが実際にどのように基礎となるデータベースに永続化されるかを知る必要はありません。この永続性の知識、つまり永続性ロジックは、リポジトリ内にカプセル化されています。
本質的に、リポジトリデザインパターンは、アプリケーション内のビジネスロジックとデータアクセス層の分離を容易にします。前者は、データの永続性が実際にどのように行われるかについての知識を持っている必要はありません。
リポジトリデザインパターンを使用すると、データストアとの間でデータが最終的に保存または取得される方法の詳細を非表示にできます。このデータストアには、データベース、xmlファイルなどがあります。このデザインパターンを適用して、WebサービスまたはORMによって公開されているデータへのアクセス方法を非表示にすることもできます。 Martin Fowlerは次のように述べています。「ドメインオブジェクトにアクセスするためのコレクションのようなインターフェイスを使用して、ドメインとデータマッピングレイヤーの間を仲介します。」
リポジトリは、メモリ内に存在するドメインオブジェクトのコレクションとして定義されます。MSDNは次のように述べています。「リポジトリを使用して、データを取得してエンティティモデルにマップするロジックを、モデルに作用するビジネスロジックから分離します。ビジネスロジックは、データソースレイヤーを構成するデータの種類に依存しない必要があります。 。たとえば、データソースレイヤーは、データベース、SharePointリスト、またはWebサービスにすることができます。」
C#でのリポジトリデザインパターンの実装
このセクションでは、リポジトリのデザインパターンをプログラムする方法について説明します。リポジトリデザインパターンの実装では、参加するタイプには次のものが含まれます。
- IRepositoryインターフェース-このインターフェースは、すべてのリポジトリタイプの基本タイプです。
- リポジトリクラス-これは汎用リポジトリクラスです
- IRepositoryインターフェースを実装する1つ以上のリポジトリクラス
それでは、いくつかのコードを掘り下げてみましょう。次のクラスは、すべてのエンティティクラスの派生元となる基本エンティティクラスを定義する方法を示しています。
public abstract class EntityBase
{
public Int64 Id { get; protected set; }
}
このクラスは、「Id」という名前のフィールドが1つだけある抽象として定義されています。「Id」フィールドは、一般的に使用するすべてのエンティティに共通ですよね。一般的なIRepositoryインターフェイスは次のようになります。
public interface IRepository where T : EntityBase
{
T GetById(Int64 id);
void Create(T entity);
void Delete(T entity);
void Update(T entity);
}
汎用リポジトリクラスは、IRepositoryインターフェイスを実装し、インターフェイスのメンバーを実装します。
public class Repository : IRepository where T : EntityBase
{
public void Create(T entity)
{
//Write your logic here to persist the entity
}
public void Delete(T entity)
{
//Write your logic here to delete an entity
}
public T GetById(long id)
{
//Write your logic here to retrieve an entity by Id
throw new NotImplementedException();
}
public void Update(T entity)
{
//Write your logic here to update an entity
}
}
特定のクラスのリポジトリを作成する
特定のエンティティのリポジトリを作成する場合は、汎用IRepositoryインターフェイスを実装するクラスを作成する必要があります。次のコードリストは、これを実現する方法を示しています。
public class CustomerRepository : IRepository
{
//Write your code here to implement each of the methods of the IRepository interface.
}
同様に、ProductRepositoryを作成する場合は、最初にEntityBaseクラスを拡張するエンティティクラスProductを作成する必要があります。
public class Product: EntityBase
{
public string ProductName { get; set; }
public string Category { get; set; }
}
ProductRepositoryクラスは、汎用のIRepositoryインターフェイスを実装する必要があります。ProductRepositoryクラスは次のようになります。
public class ProductRepository : IRepository
{
//Write your code here to implement each of the methods of the IRepository interface.
}