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 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返回本系列開篇

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM