標籤:
原文:ASP.NET MVC+EF架構+EasyUI實現許可權管理系列(8)-DbSession線程內唯一
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 RoleRepository12 13 {14 15 get { return new RoleRepository(); }16 17 }18 19 public IDAL.IUserInfoRepository UserInfoRepository20 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的執行方法 ObjectContext46 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)這裡因為底層的東西基本也就這些東西了,後面的東西都是在這些基礎上面進行擴充,所以現在看整個系統的架構:
Kencery返回本系列開篇
ASP.NET MVC+EF架構+EasyUI實現許可權管理系列(8)-DbSession線程內唯一