今天我們主要討論下數據層父類和業務層父類的使用。眾所周知,數據層無非就是實現增刪改查的方法。無論是哪個實體類,無非就是為了實現增刪改查方法,所有我們在三層的DAL層封裝了一個BaseDAL類,來做增刪改查。在BLL層封裝了一個BaseBLL類,來做增刪改查。如果在Model層,通過ModelFirst的方式,又添加了新的實體(YYY),那么在DAL層只需要定義一個類YYYDAL,並讓YYYDAL繼承自BaseDAL即可 。同理,在BLL層, 只需要定義一個類YYYBLL,並讓其繼承自BaseBLL即可 。下面我們來完成這個描述。
由於該文章的側重點數據層父類和業務層父類的使用。所以我們就不再領着大家搭建三層結構。默認大家已經創建好的程序的架構。
並且在edmx模型中我們已經創建了兩個實體。這里我們使用Customer和Ticket(由於最近在講解影院售票系統)
步驟一:先在DAL層創建一個CustomerDAL類,並且書寫對應的增刪改查以及分頁的方法。
1 public class CustomerDAL 2 { 3 //數據庫上下文對象 4 YYMMVCEntities db = new YYMMVCEntities(); 5 /// <summary> 6 /// 新增操作 7 /// </summary> 8 public int Add(Customer customer) 9 { 10 db.Customers.AddObject(customer); 11 //保存成功后會將自增的ID設置成customer的主鍵屬性 12 return db.SaveChanges(); 13 } 14 //刪除 15 public int DeleteBy(int cid) 16 { 17 Customer customer=new Customer(){CID = cid}; 18 db.Customers.Attach(customer); 19 db.Customers.DeleteObject(customer); 20 return db.SaveChanges(); 21 } 22 //根據條件刪除 23 public int DeleteExpression(System.Linq.Expressions.Expression<Func<Customer,bool>> deleWhere) 24 { 25 List<Customer> customers=db.Customers.Where(deleWhere).ToList(); 26 customers.ForEach(m=>db.Customers.DeleteObject(m)); 27 return db.SaveChanges(); 28 } 29 30 //修改方法 31 public int Modify(Customer customer) 32 { 33 db.Attach(customer); 34 db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified); 35 return db.SaveChanges(); 36 } 37 //查詢 38 publicList<Customer> GetListBy(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere) 39 { 40 return db.Customers.Where(seleWhere).ToList(); 41 } 42 //查詢和排序 43 public List<Customer> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere,System.Linq.Expressions.Expression<Func<Customer,Tkey>> orderWhere) 44 { 45 return db.Customers.Where(seleWhere).OrderBy(orderWhere).ToList(); 46 } 47 //分頁查詢 48 public List<Customer> GetListPaged(int pageIndex,int pageSize,System.Linq.Expressions.Expression<Func<Customer,bool>> orderbyWhere) 49 { 50 return db.Customers.OrderBy(orderbyWhere).Skip((pageIndex - 1)*pageSize).Take(pageSize).ToList(); 51 } 52 }
第二步:書寫BaseDAL類
然后我們在DAL層新建一個BaseDAL類,類中內容是通過CustomerDAL修改而來的,將出現Customer的地方替換成了T,出現Customers的地方改成了CreateObjectSet<T>()
,修正后的類如下
1 public class BaseDAL<T> where T:class,new() 2 { 3 //數據庫上下文對象 4 YYMMVCEntities db = new YYMMVCEntities(); 5 /// <summary> 6 /// 新增操作 7 /// </summary> 8 public int Add(T customer) 9 { 10 //必須限定T的類型,只能為引用類型 11 db.CreateObjectSet<T>().AddObject(customer); 12 //保存成功后會將自增的ID設置成customer的主鍵屬性 13 return db.SaveChanges(); 14 } 15 16 //刪除 17 public int DeleteBy(T model) 18 { 19 20 db.CreateObjectSet<T>().Attach(model); 21 db.CreateObjectSet<T>().DeleteObject(model); 22 return db.SaveChanges(); 23 } 24 //根據條件刪除 25 public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere) 26 { 27 List<T> customers = db.CreateObjectSet<T>().Where(deleWhere).ToList(); 28 customers.ForEach(m => db.CreateObjectSet<T>().DeleteObject(m)); 29 return db.SaveChanges(); 30 } 31 32 //修改方法 33 public int Modify(T customer) 34 { 35 db.CreateObjectSet<T>().Attach(customer); 36 db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified); 37 return db.SaveChanges(); 38 } 39 40 //查詢 41 public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere) 42 { 43 return db.CreateObjectSet<T>().Where(seleWhere).ToList(); 44 } 45 //查詢和排序 46 public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere) 47 { 48 return db.CreateObjectSet<T>().Where(seleWhere).OrderBy(orderWhere).ToList(); 49 } 50 //分頁查詢 51 public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere) 52 { 53 return db.CreateObjectSet<T>().OrderBy(orderbyWhere).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); 54 55 } 56 }
其中public class BaseDAL<T> where T:class,new()中where T:class代表T的類型只能是引用類型,new()代表T類型必須有無參的構造。
到這里我們已經完成了對DAL層父類的書寫。
第三步:書寫BaseBLL類
接下來,我們就可以書寫BaseBLL類了,當然,抽取BaseBLL類的方式和抽取BaseDAL的方式基本一致,在這里就直接寫出BaseBLL的類的代碼結構了。
1 public class BaseBLL<T> where T:class,new () 2 { 3 protected BaseDAL<T> dal = new BaseDAL<T>(); 4 /// <summary> 5 /// 新增操作 6 /// </summary> 7 public int Add(T customer) 8 { 9 return dal.Add(customer); 10 } 11 12 //刪除 13 public int DeleteBy(T cid) 14 { 15 return dal.DeleteBy(cid); 16 } 17 //根據條件刪除 18 public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere) 19 { 20 return dal.DeleteExpression(deleWhere); 21 } 22 23 //修改方法 24 public int Modify(T customer) 25 { 26 return dal.Modify(customer); 27 } 28 29 //查詢 30 public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere) 31 { 32 return dal.GetListBy(seleWhere); 33 } 34 //查詢和排序 35 public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere) 36 { 37 return dal.GetListBy(seleWhere, orderWhere); 38 } 39 //分頁查詢 40 public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere) 41 { 42 return dal.GetListPaged(pageIndex, pageSize, orderbyWhere); 43 44 } 45 }
其實,我們發現一個問題,就先現在我們的BLL層就是起到了一個數據隔離的作用。
然后我們就可以在對應的DAL層和BLL層創建對應的子類來繼承自各自的父類。接下來我們通過ModelFirst的方式修改edmx模型,在其中添加一個新的實體Book,並且建立Customer和Book之間的關系(1對多)。如下圖:
步驟四:在DAL層添加BookDAL類,並且繼承自BaseDAL;在BLL層添加BookBLL類,並且繼承自BaseBLL類。
在頁面的Load事件中書寫如下代碼:
1 if (!IsPostBack) 2 { 3 BookBLL bll=new BookBLL(); 4 List<Book> list=bll.GetListBy(m => m.ID > 0); 5 Repeater1.DataSource = list; 6 Repeater1.DataBind(); 7 }
就可以驗證子類對象是否成功繼承父類的方法。
好的,我們今天的探討到此結束!