汎用汎用汎用ストレージインタフェースの設計
9300 ワード
Repositoryモードは、分野駆動設計に多く使われており、汎用的なストレージインタフェースを構築し、コードの再利用を大幅に向上させ、コアビジネスを処理する時間を解放することができます.つまり、ストレージはこれらの共通のストレージインタフェースに依存するだけで基本的なストレージ操作を完了することができ、ビジネスストレージごとに簡単な削除変更を追加する必要はありません.="共通性を抽出し、個性に注目する.
ストレージインタフェースの設計:
読み取り可能なストレージインタフェースの設計:
書き込み可能ストレージインタフェースの設計:
ストレージインタフェースの例:
ストレージ実装クラスの例:
汎用インタフェースメソッド実装クラス:SqlServerRepositoryBase
ストレージインタフェースの設計:
/// <summary>
///
/// </summary>
/// <typeparam name="TEntity"> </typeparam>
public interface IRepository<TEntity> where TEntity : IEntity
{
/// <summary>
///
/// </summary>
IDataContext Context { get; }
}
読み取り可能なストレージインタフェースの設計:
/// <summary>
///
/// </summary>
/// <typeparam name="TEntity"> </typeparam>
/// <typeparam name="TKey"> </typeparam>
public interface IReadRepository<TEntity,TKey> : IRepository<TEntity> where TEntity:IEntity
{
/// <summary>
///
/// </summary>
/// <param name="key"> </param>
/// <returns> </returns>
bool Exists(TKey key);
/// <summary>
///
/// </summary>
/// <param name="key"> </param>
/// <returns> , null</returns>
TEntity GetSingle(TKey key);
/// <summary>
///
/// </summary>
/// <returns> </returns>
IEnumerable<TEntity> GetList();
}
書き込み可能ストレージインタフェースの設計:
/// <summary>
///
/// </summary>
/// <typeparam name="TEntity"> </typeparam>
/// <typeparam name="TKey"> </typeparam>
public interface IWriteRepository<TEntity,TKey>:IRepository<TEntity> where TEntity:IEntity
{
/// <summary>
///
/// </summary>
/// <param name="entity"> </param>
void Add(TEntity entity);
/// <summary>
///
/// </summary>
/// <param name="entity"> </param>
void Update(TEntity entity);
/// <summary>
///
/// </summary>
/// <param name="key"> Key</param>
void Delete(TKey key);
}
ストレージインタフェースの例:
/// <summary>
/// --
/// </summary>
public interface IUserService : IRepository<User>,IWriteRepository<User,int>,IReadRepository<User,int>
{
// ...
}
ストレージ実装クラスの例:
public class SqlServerUserService : SqlServerRepositoryBase<User, int>, IUserService
{
public SqlServerUserService(IDataContext context)
: base((SqlServerRepositoryContext)context)
{ }
}
汎用インタフェースメソッド実装クラス:SqlServerRepositoryBase
public abstract class SqlServerRepositoryBase<TEntity,TKey>:IRepository<TEntity>,IReadRepository<TEntity,TKey>,
IWriteRepository<TEntity,TKey> where TEntity:IEntity,new()
{}