ASP.NET MVC+EF架構+EasyUI實現許可權管理系列(8)-DbSession線程內唯一

來源:互聯網
上載者:User

標籤:

原文: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線程內唯一

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.