第一次寫博客,想了半天先從簡單的三層架構開始吧,希望能幫助到你! 簡單介紹一下三層架構, 三層架構從上到下分:表現層(UI),業務邏輯層(BLL),數據訪問層(DAL)再加上數據模型(Model),用ef訪問資料庫,Model也就是與資料庫表映射的實體。廢話少說,上代碼。 Model層 為方便說明, ...
第一次寫博客,想了半天先從簡單的三層架構開始吧,希望能幫助到你!
簡單介紹一下三層架構, 三層架構從上到下分:表現層(UI),業務邏輯層(BLL),數據訪問層(DAL)再加上數據模型(Model),用ef訪問資料庫,Model也就是與資料庫表映射的實體。廢話少說,上代碼。
- 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 }
- DAL層
首先設計通用的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 { }
- BLL層
首先像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://pan.baidu.com/s/1itW5XKBYB1onkQDfuwJvMw
提取碼:ye0n
說明:源碼中Model層中採用的ef的Model First方式創建資料庫,下載以後不能直接運行,可以將Model程式集中的Model.edmx.sql在sqlserver創建資料庫,以DataBase First方式重新創建Model程式集,可以正常運行。