すべてのデータアクセステクノロジーを使用してリポジトリを活用できます。リポジトリは、既存のデータアクセスヘルパー/サービスを抽象化したものであり、データアクセス層からビジネスロジックを分離できます。フィルタリングを有効にするためにQueryと一緒に使用されるリポジトリ。多くの場合、変更をデータベースに保存するために作業単位と一緒に使用されます。
リポジトリには少なくとも次のものがあります。
- キーごとのオブジェクトの取得操作
- すべてのオブジェクトを取得操作
- Get-first-object-by-query操作
- クエリによるオブジェクトの取得操作
非常に簡単な例:):
A. Commonで定義されている製品クラス:
public class Product
{
public int Id { get; private set; }
public string Code { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
B. Query、IRepository、およびIUnitOfWorkのクラスは、 DAL.interfaces.dllまたはCommon.dllで定義されています(ただし、DALでは定義されていません)。
public class Query
{
public string Text { get; set; }
}
public interface IRepository<TEntity>
where TEntity : class
{
bool TryGet(int key, out TEntity value);
TEntity this[int key] { get; }
IEnumerable<TEntity> GetAll();
bool TryGetFirst(Query condition, out TEntity value);
TEntity GetFirst(Query condition);
IEnumerable<TEntity> GetAll(Query condition);
int Count { get; }
}
public interface IUnitOfWork
{
void SetAdded(TEntity value); // Marks entity as added for further INSERT
void SetRemoved(TEntity value); // Marks entity as removed for further DELETE
void SetChanged(TEntity value); // Marks entity as modified for further UPDATE
void Save(); // Save all the changes
}
IUnitOfWorkは、変更されたエンティティを認識します。Save()は、データベース内の変更を永続化するために、変更されたエンティティごとに適切なDatabaseHelper /OdbcHelperCRUDメソッドを呼び出します。
IRepository <Product>、... IRepository <EntityXY>およびIUnitOFWorkの実装は、DALに配置する必要があります。次に、BLLは、ビジネス(ドメイン)ロジックを実装するためにIRepositoryとIUnitOFWorkを使用します。BLL自体は、ドメインモデルの最上位にあるサービス層として編成できますが、説明の範囲外です:)。
私の答えがお役に立てば幸いです。
お気軽にご質問ください...
リンク:
MartinFowlerによるエンタープライズアプリケーションアーキテクチャのパターン