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