zoukankan      html  css  js  c++  java
  • 通用泛型存储接口的设计

    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()
        {}
  • 相关阅读:
    (DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device【转】
    Linux 内核虚拟地址到物理地址转换讨论【转】
    【Go命令教程】6. go doc 与 godoc
    【Go命令教程】5. go clean
    【Go命令教程】4. go get
    PHP项目收藏
    【Go命令教程】3. go install
    分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验
    【Go命令教程】2. go build
    【Go命令教程】1. 标准命令详解
  • 原文地址:https://www.cnblogs.com/KingLei/p/3094940.html
Copyright © 2011-2022 走看看