数据仓储之DLL层接口设计
Posted CeleryCabbage
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓储之DLL层接口设计相关的知识,希望对你有一定的参考价值。
1 一、接口设计 2 1.1. IBaseRepository.cs 3 public interface IBaseRepository<T> 4 { 5 T Add(T entity); 6 bool Update(T entity); 7 bool Delete(T entity); 8 IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda); 9 IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc); 10 11 } 12 1.2. ICompanyRepository.cs 13 public interface ICompanyRepository:IBaseRepository<Company> 14 { 15 16 } 17 二、接口实现 18 2.1 BaseRepository.cs 19 public class BaseRepository<T> where T:class,new() 20 { 21 private ObjectContext dbContext 22 { 23 get 24 { 25 return EFDbContextFactory.GetCurrentDbContext(); 26 } 27 } 28 public virtual T Add(T entity) 29 { 30 dbContext.CreateObjectSet<T>().AddObject(entity); 31 return entity; 32 } 33 34 public virtual bool Update(T entity) 35 { 36 37 dbContext.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified); 38 return true; 39 } 40 41 public virtual bool Delete(T entity) 42 { 43 dbContext.ObjectStateManager.ChangeObjectState(entity,System.Data.EntityState.Deleted); 44 return true; 45 } 46 47 public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda) 48 { 49 return dbContext.CreateObjectSet<T>().Where(whereLambda).AsQueryable(); 50 } 51 public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T,S>> orderbyLambda, bool isAsc) 52 { 53 total = dbContext.CreateObjectSet<T>().Where(whereLambda).Count(); 54 if (isAsc) 55 { 56 return dbContext.CreateObjectSet<T>() 57 .Where(whereLambda) 58 .OrderBy(orderbyLambda) 59 .Skip(pageSize * (pageIndex - 1)) 60 .AsQueryable(); 61 } 62 else 63 { 64 return dbContext.CreateObjectSet<T>() 65 .Where(whereLambda) 66 .OrderByDescending(orderbyLambda) 67 .Skip(pageSize * (pageIndex - 1)) 68 .AsQueryable(); 69 } 70 } 71 } 72 2.2 CompanyRepository.cs 73 public class CompanyRepository : BaseRepository<Company>,ICompanyRepository 74 { 75 76 } 77 三、IDbSession 78 3.1 IDbSession.cs 79 public interface IDbSession 80 { 81 IMemberRepository MemberRepository { get; } 82 IServiceTypeRepository ServiceTypeRepository { get; } 83 IServiceRepository ServiceRepository { get; } 84 ICompanyRepository CompanyRepository { get; } 85 IProductGroupRepository ProductGroupRepository { get; } 86 int SaveChanges(); 87 } 88 3.2 DbSession.cs 89 public class DbSession : IDbSession 90 { 91 private IMemberRepository _MemberRepository; 92 private IServiceTypeRepository _ServiceTypeRepository; 93 private IServiceRepository _ServiceRepository; 94 private ICompanyRepository _CompanyRepository; 95 private IProductGroupRepository _ProductGroupRepository; 96 97 public IMemberRepository MemberRepository 98 { 99 get 100 { 101 if (_MemberRepository == null) 102 { 103 _MemberRepository = new MemberRepository(); 104 } 105 return _MemberRepository; 106 } 107 } 108 109 public IServiceTypeRepository ServiceTypeRepository 110 { 111 get 112 { 113 if (_ServiceTypeRepository == null) 114 { 115 _ServiceTypeRepository = new ServiceTypeRepository(); 116 } 117 return _ServiceTypeRepository; 118 } 119 } 120 121 public IServiceRepository ServiceRepository 122 { 123 get 124 { 125 if (_ServiceRepository == null) 126 { 127 _ServiceRepository = new ServiceRepository(); 128 } 129 return _ServiceRepository; 130 } 131 } 132 133 public ICompanyRepository CompanyRepository 134 { 135 get 136 { 137 if (_CompanyRepository == null) 138 { 139 _CompanyRepository = new CompanyRepository(); 140 } 141 return _CompanyRepository; 142 } 143 } 144 145 public IProductGroupRepository ProductGroupRepository 146 { 147 get 148 { 149 if (_ProductGroupRepository == null) 150 { 151 _ProductGroupRepository = new ProductGroupRepository(); 152 } 153 return _ProductGroupRepository; 154 } 155 } 156 157 public int SaveChanges() 158 { 159 return EFDbContextFactory.GetCurrentDbContext().SaveChanges(); 160 } 161 162 163 164 } 165 3.3 EFDbContextFactory.cs 166 public class EFDbContextFactory 167 { 168 public static ObjectContext GetCurrentDbContext() 169 { 170 171 //线程内唯一 172 ObjectContext dbContext = (ObjectContext)CallContext.GetData("dbContext"); 173 if (dbContext == null) 174 { 175 dbContext = new SimpleNewsContext(); 176 CallContext.SetData("dbContext", dbContext); 177 } 178 return dbContext; 179 } 180 181 }
以上是关于数据仓储之DLL层接口设计的主要内容,如果未能解决你的问题,请参考以下文章
设置storage模块的数据库操作支持添加仓储分类列表接口(dao层)
.NET ORM 仓储层必备的功能介绍之 FreeSql Repository 实现篇