第一次写博客,想了半天先从简单的三层架构开始吧,希望能帮助到你!
简单介绍一下三层架构, 三层架构从上到下分:表现层(UI),业务逻辑层(BLL),数据访问层(DAL)再加上数据模型(Model),用ef访问数据库,Model也就是与数据库表映射的实体。废话少说,上代码。
为方便说明,新建一个实体模型UserInfo,数据库表中应该对应一个UserInfo表,至于怎样建立表,有多种方式,用ef来建立表比较方便。具体怎样用ef访问数据库,后续会在其他文章中解释,敬请关注。
1 public class UserInfo 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 public short Age { get; set; } 6 }
首先设计通用的CRUD基接口IBaseDal,作为通用的数据库访问通道。
1 public interface IBaseDal<T> where T : class,new() 2 { 3 void Add(T entity); 4 void Delete(T entity); 5 void Update(T entity); 6 IQueryable<T> GetEntities(Expression<Func<T, bool>> expression); 7 IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression); 8 bool SaveChanges(); 9 }
以UserInfo实体为例,继承IBaseDal接口
public interface IUserInfoDal : IBaseDal<UserInfo> { }
接口设计完成,设计通用基类,这里存在变化点,本例用ef实现,如果以后通过其他实体框架或者直接通过ado.net访问数据库,只需要改动这个类。
public class BaseDal<T> where T : class,new() { private DbContext dbContext = DbContextFactory.DbContext; public void Add(T entity) { dbContext.Set<T>().Add(entity); } public void Delete(T entity) { dbContext.Entry(entity).State = EntityState.Deleted; } public void Update(T entity) { dbContext.Entry(entity).State = EntityState.Modified; } public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression) { return dbContext.Set<T>().Where(expression); } public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression) { if (isAsc) //升序 { return dbContext.Set<T>().Where(expression).OrderBy(keySelector).Skip((pageIndex - 1) * pageSize).Take(pageSize); } else //降序 { return dbContext.Set<T>().Where(expression).OrderByDescending(keySelector).Skip((pageIndex - 1) * pageSize).Take(pageSize); } } public bool SaveChanges() { return dbContext.SaveChanges() > 0; } }
public static class DbContextFactory { public static DbContext DbContext { get { DbContext dbContext = CallContext.GetData("DbContext") as DbContext; if (dbContext == null) { dbContext = new ModelContainer(); CallContext.SetData("DbContext", dbContext); } return dbContext; } } }
接下来实现具体的实体数据访问层,以UserInfoDal为例,其余类似。
public class UserInfoDal : BaseDal<UserInfo>, IUserInfoDal { }
首先像DAL层一样,定义通用接口。
public interface IBaseService<T> where T : class,new() { void Add(T entity); void Delete(T entity); void Update(T entity); IQueryable<T> GetEntities(Expression<Func<T, bool>> expression); IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression); bool SaveChanges(); }
通用基类,注意通用基类不需要实现上面的接口
public class BaseService<T> where T : class,new() { private BaseDal<T> baseDal = new BaseDal<T>(); public void Add(T entity) { baseDal.Add(entity); } public void Delete(T entity) { baseDal.Delete(entity); } public void Update(T entity) { baseDal.Update(entity); } public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression) { return baseDal.GetEntities(expression); } public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression) { return baseDal.GetEntitiesByPage(pageSize, pageIndex, isAsc, keySelector, expression); } public bool SaveChanges() { return baseDal.SaveChanges(); } }
接下来是UserInfoService
public class UserInfoService : BaseService<UserInfo>, IBaseService<UserInfo> { }
至此,所有底层代码完成,顶层的UI层调用不在赘述了,这里附上源码下载地址。
原文:https://www.cnblogs.com/chirsli/p/10533169.html