第六篇 项目疑问 ------- BaseService where T : class, new() 含义

  public abstract class BaseService<T> where T : class, new()
    {
        //当前仓储
        //DbSession的存放
        //为了职责单一的原则,将获取线程内唯一实例的DbSession的逻辑放到工厂里面去了
        public IDbSession DbSession = DbSessionFactory.GetCurrentDbSession();
        //基类的构造函数
        protected BaseService()
        {
            SetCurrentRepository(); //构造函数里面去调用了,此设置当前仓储的抽象方法
        }

        public IBaseRepository<T> CurrentRepository { get; set; }

        public abstract void SetCurrentRepository(); //子类必须实现

        //实现对数据库的添加功能
        public T AddEntity(T entity)
        {
            //调用T对应的仓储来做添加工作
            T addEntity = CurrentRepository.AddEntity(entity);
            DbSession.SaveChanges();
            return addEntity;
        }

        //实现对数据的修改功能
        public bool UpdateEntity(T entity)
        {
            CurrentRepository.UpdateEntity(entity);

            return DbSession.SaveChanges() > 0;
        }

        //实现对数据库的删除功能
        public bool DeleteEntity(T entity)
        {
            CurrentRepository.DeleteEntity(entity);
            return DbSession.SaveChanges() > 0;
        }

        //实现对数据库的查询  --简单查询
        public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
        {
            return CurrentRepository.LoadEntities(whereLambda);
        }

        //实现对数据库的查询  --简单查询
        public IQueryable<T> LoadEntities()
        {
            return CurrentRepository.LoadEntities();
        }

        /// <summary>
        ///     实现对数据的分页查询
        /// </summary>
        /// <typeparam name="S">按照某个类进行排序</typeparam>
        /// <param name="pageIndex">当前第几页</param>
        /// <param name="pageSize">一页显示多少条数据</param>
        /// <param name="total">总条数</param>
        /// <param name="whereLambda">取得排序的条件</param>
        /// <param name="isAsc">如何排序,根据倒叙还是升序</param>
        /// <param name="orderByLambda">根据那个字段进行排序</param>
        /// <returns></returns>
        public IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total,
                                                 Expression<Func<T, bool>> whereLambda,
                                                 bool isAsc, Expression<Func<T, S>> orderByLambda)
        {
            return CurrentRepository.LoadPageEntities(pageIndex, pageSize, out total, whereLambda, isAsc, orderByLambda);
        }
    }
}



查找后发现这是类型参数约束,.NET支持的类型参数约束有以下五种:

 

where T : struct                               | T必须是一个结构类型
where T : class                               T必须是一个类(class)类型
where T : new()                               | T必须要有一个无参构造函数
where T : NameOfBaseClass          | T必须继承名为NameOfBaseClass的类
where T : NameOfInterface             | T必须实现名为NameOfInterface的接口

文章参考:http://xdwangiflytek.iteye.com/blog/1390464


你可能感兴趣的:(第六篇 项目疑问 ------- BaseService where T : class, new() 含义)