汎用汎用汎用ストレージインタフェースの設計


Repositoryモードは、分野駆動設計に多く使われており、汎用的なストレージインタフェースを構築し、コードの再利用を大幅に向上させ、コアビジネスを処理する時間を解放することができます.つまり、ストレージはこれらの共通のストレージインタフェースに依存するだけで基本的なストレージ操作を完了することができ、ビジネスストレージごとに簡単な削除変更を追加する必要はありません.="共通性を抽出し、個性に注目する.
ストレージインタフェースの設計:
   /// <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()

    {}