ASP.NET MVC+EF框架+EasyUI實現權限管系列
(開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝
(5):前台Jquery easyUI實現 (6):EF上下文實例管理 (7):DBSession的封裝
前言:通過上篇博客我們完成了對DbSession的代碼編寫,DbSession就相當於數據庫訪問層的入口,只要我們要操作數據庫我們就能夠從這里進入到數據庫,而且能取到所有的實體的對象,這些知識點我在上篇博客基本都已經說了,博友們可以去看看,現在系列已經寫到8了,這期間謝謝廣大博主的支持和回復,你們的評論將是我學習的動力,希望你們能對我的博客進行評論。這篇博客我們繼續來說我們的底層的實現,可能大部分博友們也有點心急,什么時候能見到頁面呢,現在快了,當我介紹完TT模版和源代碼管理工具之后我們就能夠進入到權限的設置,堅持就是勝利。
1. DbSession接口的約束
(1)DbSession就是我們整個數據庫訪問層的入口,那么我們DbSession也必須由一個接口的約束,那么我們在數據庫訪問接口層(LYZJ.UserLimitMVC.IDAL類庫)加個接口約束,新建接口IDbSession。在IDbSession中有這么幾個方法,代碼如下:
1 namespace LYZJ.UserLimitMVC.IDAL 2 3 { 4 5 public interface IDbSession 6 7 { 8 9 //每個表對應的實體倉儲對象 10 11 IDAL.IRoleRepository RoleRepository { get; } 12 13 IDAL.IUserInfoRepository UserInfoRepository { get; } 14 15 //將當前應用程序跟數據庫的會話內所有實體的變化更新會數據庫 16 17 int SaveChanges(); 18 19 //執行Sql語句的方法 20 21 //EF4.0的寫法 22 23 //int ExcuteSql(string strSql, ObjectParameter[] parameters); 24 25 //EF5.0的寫法 26 27 int ExcuteSql(string strSql, DbParameter[] parameters); 28 29 } 30 31 }
(2)首先添加的是每個表對應的實體倉儲對象,
(3)添加SaveChanges方法的接口
(4)添加ExcuteSql方法的接口,int ExcuteSql(string strSql,ObjectParameter[] parameters),它的作用就是執行Sql腳本,那么如果我們再數據庫接口層添加了接口之后,我們數據庫訪問層的DbSession就要繼承自IDbSession接口,然后實現接口中的所有的方法,那么修改后的DbSession中的代碼如下:
1 namespace LYZJ.UserLimitMVC.DAL 2 3 { 4 5 //一次跟數據庫交互的會話 6 7 public class DbSession : IDbSession //代表應用程序跟數據庫之間的一次會話,也是數據庫訪問層的統一入口 8 9 { 10 11 public IDAL.IRoleRepository RoleRepository 12 13 { 14 15 get { return new RoleRepository(); } 16 17 } 18 19 public IDAL.IUserInfoRepository UserInfoRepository 20 21 { 22 23 get { return new UserInfoRepository(); } 24 25 } 26 27 //代表:當前應用程序跟數據庫的會話內所有的實體的變化,更新會數據庫 28 29 public int SaveChanges() 30 31 { 32 33 //調用EF上下文的SaveChanges方法 34 35 return DAL.EFContextFactory.GetCurrentDbContext().SaveChanges(); 36 37 } 38 39 //執行Sql腳本的方法 40 41 public int ExcuteSql(string strSql, System.Data.Common.DbParameter[] parameters) 42 43 { 44 45 //Ef4.0的執行方法 ObjectContext 46 47 //封裝一個執行SQl腳本的代碼 48 49 //return DAL.EFContextFactory.GetCurrentDbContext().ExecuteFunction(strSql, parameters); 50 51 throw new NotImplementedException(); 52 53 } 54 55 } 56 57 }
2.對EF操作SQL語句的小記
(1)在這里大家如果看我上面代碼的話會看到執行SQl語句的方法是個空方法,我想請問大家在EF5.0里面執行SQL語句的方法是什么,我只知道4.0的方法,如果大家知道的話請給我留言,謝謝大家。
(2)我們在使用EF框架的時候也可以跟ADO.NET進行配合,它們之間不是互斥的,我們的項目在某些特殊的功能中還是可以使用ADO.NET來實現的。
3.業務邏輯層DbSession線程內唯一
(1)通過前面的博客我們知道我們將數據庫訪問層的BaseRepository(倉儲)使用簡單工廠來實現了線程內唯一的定義,代碼如下:
1 //獲取的是當前線程內部的上下文實例,而且保證了線程內上下文唯一 2 3 private DbContext db = EFContextFactory.GetCurrentDbContext();
(2)按照上面的說法的話,那么我們的業務邏輯層來獲取DbSession的時候也是使用簡單工廠來實現線程內唯一,那么我們修改DbSession的定義如下:
1 //DbSession的存放 2 3 public IDbSession _DbSession = DbSessionFactory.GetCurrenntDbSession();
(3)根據(2)里面的代碼我們可以看到,這時候我們需要在數據庫訪問層,也就是(LYZJ.UserLimitMVC.DAL)下面創建一個DbSessionFactory類,我們使用這個類來實現GetCurrentDbSession方法,這樣我們的DbSession也就實現了線程內唯一。
(4)那么最后我們實現的DbSessionFactory的代碼如下所示,因為在前面我已經介紹過實現線程內唯一了,所以這里就不詳細的介紹了,適當的注釋一下:代碼如下:
1 namespace LYZJ.UserLimitMVC.DAL 2 3 { 4 5 public class DbSessionFactory 6 7 { 8 9 //保證了線程內DbSession實例唯一 10 11 public static IDbSession GetCurrenntDbSession() 12 13 { 14 15 //這里的GetData()方法的key不能和上下文的一樣 16 17 IDbSession _dbSession = CallContext.GetData("DbSession") as IDbSession; 18 19 if (_dbSession == null) 20 21 { 22 23 _dbSession = new DbSession(); 24 25 //將值設置到數據槽里面去 26 27 CallContext.SetData("DbSession", _dbSession); 28 29 } 30 31 return _dbSession; 32 33 } 34 35 } 36 37 }
(5)在這里要注意的是我們什么時候使用簡單工廠,什么時候使用new?那就是我們的實例的生命周期的時候,我們要進行控制他,如果我們不控制的話那么我們直接使用new即可。比如我們的表實體我們如果想創建的話,那么我們直接new一個就可以了,而不需要去創建一個簡單工廠。
4.小結
(1)這篇Demo的底層框架我們到這里就實現完了,今天寫的比較少,因為只有實現了一個知識點,那就是對DbSession的線程內唯一的訪問。明天開始我將繼續寫如何使用T4模版和源代碼管理工具,當介紹完這些的時候,我就會正式開始介紹權限系統。謝謝大家的支持
(2)這里因為底層的東西基本也就這些東西了,后面的東西都是在這些基礎上面進行擴展,所以現在看整個系統的架構如圖所示:
源碼下載
(1):完整源碼下載
Kencery返回本系列開篇