ASP.NET MVC+EFフレームワーク+EasyUIによる権限管理シリーズ(7)-DBSessionのパッケージ化

22451 ワード

ASP.NET MVC+EFフレームワーク+EasyUI実現権限管シリーズ
   (冒頭)     (1):フレーム構築      (2):データベースアクセス層の設計Demo     (3):インタフェース向けプログラミング    (4):ビジネスロジック層のパッケージ  
   (5):フロントJquery easyUI実装    (6):EFコンテキストインスタンス管理
前言:前回のブログではEFフレームワークの実装コンテキストを再操作し、DbSessionも構築しました.CallContextクラスを使用して、現在のスレッド内の唯一のデータベースコンテキストを返すことができます.そうすれば、ベース・ストレージでnewインスタンスを二度と使用しません.簡単な工場を使ってEFContextFactoryの中でスレッド内を実現する唯一の方法:GetCurrentDbContextを呼び出すだけで、このブログは引き続きDbSession類のパッケージについてお話しします.このシリーズはすでに7に書かれています.ここでは、読むときに全部読むことができることをお勧めします.あるいは、このモードを知っていれば必要ありません.では、DbSession類にはどのような不思議な点があるのか、以下の紹介を見てください.
1.EFContextFactoryスレッド内の唯一の復習
(1)ここでスレッド内の唯一の説明をします.先生の話では、このスレッドが服であり、服ごとにポケットがあると仮定すると、このポケットをデータスロット(CallContextが指すメモリ空間)と見なすことができ、服ごとに自分のポケット(特殊なものを除く)があります.この时、あなたは服のポケットの中から砂糖を取り出して、この时私は先にポケットの中に行って検査して、もし服のポケットの中に私达があれば出して、私が先に砂糖を服のポケットの中に入れて、あなたが次に来た时に引き続き判断しています.そして、すべての服には独自のポケットがあり、彼らは何の関連もなく、すべての服に砂糖があることを保証しています(スレッド内で唯一).
(2)CallContextはスレッド内で一意であることを保証するのに役立ちます.
2.DbSession
(1)DbSessionには私たちのすべての倉庫の属性がカプセル化されており、属性の中で私たちの倉庫の例を手に入れることができます.では、DbSessionは私たちのデータベースアクセス層全体の統一的な入り口と見なすことができます.また、DbSessionにはSaveChangesメソッドがカプセル化されています.では、SaveChangesではどうすればいいのでしょうか.次のコードを見てください.
namespace LYZJ.UserLimitMVC.DAL

{

    //           

    public class DbSession  //

    {

        public IDAL.IRoleRepository RoleRepository

        {

            get { return new RoleRepository(); }

        }
        public IDAL.IUserInfoRepository UserInfoRepository

        {

            get { return new UserInfoRepository(); }

        }

        //  :                      ,      

        public int SaveChanges()

        {

            //  EF    SaveChanges  

            return DAL.EFContextFactory.GetCurrentDbContext().SaveChanges();

        }

    }

}

(2)SaveChangesメソッドをカプセル化すると,現在のスレッド内のコンテキストを直接取得し,コンテキストのSaveChangesメソッドを呼び出すことで,現在のスレッド内のすべてのエンティティの変更を直接データベースにコミットすることになり,上のコードを見てもほとんどの人が何も感じていない可能性があるが,これは何をしているのだろうか.この時私はBaseRepository(倉庫)の削除方法のdbを増やす仕事をしていました.SaveChanges()を削除すると、メリットがわかります.それは、私たちのデータベース・アクセス・レイヤが呼び出す方法は本当にデータベースに保存されていませんが、つまりSaveChangesをすべてDbSessionに入れて実現すれば、DbSessionは本当のセッションと見なすことができます.
(3)つまり,以前に何度も削除されたエンティティを呼び出した後(多くのテーブルを操作する)に,DbSessionでSaveChangesメソッドを呼び出すだけで,すべてのテーブルエンティティの変化をデータベースに格納することができる.
3.SaveChangesメソッドをDbSessionに配置するメリット
(1)ではSaveChangesメソッドをDbSessionに置くメリットは何でしょうか.プロジェクトの例を挙げてみましょう.BaseServiceに戻って倉庫を追加します.エンティティを追加すると、ユーザーを追加するエンティティを作成し、ビジネスにステータスを変更します.コードは次のようになります.
 1 //           
 2 
 3 public T AddEntity(T entity)
 4 
 5 {
 6 
 7      //  T           
 8 
 9     CurrentRepository.AddEntity(entity);
10 
11     CurrentRepository.UpdateEntity(entity);
12 
13 }

(2)ここでは、ビジネスシーンで多くのテーブルを操作する可能性があります.これまでの方法では、呼び出しのたびにSaveChangesが実行されていました.例えば、ユーザーを追加するとSaveChangersが必要になり、権限を支払うには1回かかります.そうすると、データベースと何度も対話します.では、SaveChangersメソッドをDbSessionに抽出することを考えます.
(3)SaveChangersをDbSessionに抽出すると,後で複数のエンティティを操作した後に直接DbSessionインプリメンテーションを呼び出すと,対応する上記の追加方法が実現される.
 1  //DbSession   
 2 
 3         public DbSession _DbSession = new DbSession();
 4 
 5         //       
 6 
 7         public BaseService()
 8 
 9         {
10 
11             SetCurrentRepository();  //
12 
13         }
14 
15         public abstract void SetCurrentRepository();  //      
16 
17         //           
18 
19         public T AddEntity(T entity)
20 
21         {
22 
23             //  T           
24 
25             CurrentRepository.AddEntity(entity);
26 
27             CurrentRepository.UpdateEntity(entity);
28 
29             _DbSession.SaveChanges();
30 
31         }

(4)このときDbSessionをカプセル化すると,SaveChangersの権利をデータベースアクセス層からビジネスロジック層に高め,ビジネスロジック層にSaveChangersメソッドを制御させ,データベースアクセス層にSaveChangersメソッドを行う必要がなくなり,これにより、1つのビジネスシーンで複数のテーブルを操作するのに1回のコミットが必要であることが保証され、データベースとのインタラクションの回数が減少します.
4.BaseServiceへの変更
(1)上記で説明したように、BaseServiceを修正します.修正された最終コードは以下の通りです.
  1 namespace LYZJ.UserLimitMVC.BLL
  2 
  3 {
  4 
  5     public abstract class BaseService<T> where T : class, new()
  6 
  7     {
  8 
  9         //    
 10 
 11         public IDAL.IBaseRepository<T> CurrentRepository { get; set; }
 12 
 13         //DbSession   
 14 
 15         public DbSession _DbSession = new DbSession();
 16 
 17         //       
 18 
 19         public BaseService()
 20 
 21         {
 22 
 23             SetCurrentRepository();  //
 24 
 25         }
 26 
 27         public abstract void SetCurrentRepository();  //      
 28 
 29         //           
 30 
 31         public T AddEntity(T entity)
 32 
 33         {
 34 
 35             //  T           
 36 
 37             var AddEntity = CurrentRepository.AddEntity(entity);
 38 
 39             _DbSession.SaveChanges();
 40 
 41             return AddEntity;
 42 
 43         }
 44         //          
 45 
 46         public bool UpdateEntity(T entity)
 47 
 48         {
 49 
 50             CurrentRepository.UpdateEntity(entity);
 51 
 52             return _DbSession.SaveChanges() > 0;
 53 
 54         }
 55         //           
 56 
 57         public bool DeleteEntity(T entity)
 58 
 59         {
 60 
 61              CurrentRepository.DeleteEntity(entity);
 62 
 63             return _DbSession.SaveChanges() > 0;
 64 
 65         }
 66         //           --    
 67 
 68         public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
 69 
 70         {
 71 
 72             return CurrentRepository.LoadEntities(whereLambda);
 73 
 74         }
 75 
 76         /// <summary>
 77 
 78         ///           
 79 
 80         /// </summary>
 81 
 82         /// <typeparam name="S">         </typeparam>
 83 
 84         /// <param name="pageIndex">     </param>
 85 
 86         /// <param name="pageSize">         </param>
 87 
 88         /// <param name="total">   </param>
 89 
 90         /// <param name="whereLambda">       </param>
 91 
 92         /// <param name="isAsc"></param>
 93 
 94         /// <param name="orderByLambda">          </param>
 95 
 96         /// <returns></returns>
 97 
 98        public  IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total, Func<T, bool> whereLambda,
 99 
100                                           bool isAsc, Func<T, S> orderByLambda)
101 
102         {
103 
104             return CurrentRepository.LoadPageEntities(pageIndex, pageSize, out total, whereLambda, isAsc, orderByLambda);
105 
106         }
107 
108     }
109 
110 }

(2)DbSessionパッケージは簡単であるが,単純ファクトリモードとSaveChangersメソッド(現在のセッションで重要な機能)を兼ね備えており,SaveChangersメソッドの簡単な数行のコードであるが,ここではユニットワークモード(UIntWork)というモードを実現した.
(3)ユニットワークモードとは、大量にデータベースに対する操作をデータベースに提出することであり、一連のデータベースに対する操作をユニットワークにカプセル化し、一度にユニットワークの中のすべての変更をデータベースに提出することである.これがユニットワークモードであり、その目的はデータベースとの相互作用の効率を高めることである.データベースとのインタラクションを減らす.
5.まとめ
(1)このブログは最后にいくつかのブロ友达が前にメッセージをくれた答えを出します.まず、私が书いたのは権限管理ですか.私の答えは間違いありませんが、あなたの前にはまだそこを見ていません.それは私がまだ底辺の情報を書いているからです.私たちが底辺を書いたとき、インタフェースのものとビジネスロジックはまだよくありませんか.
(2)私が今このプロジェクトをやっているのは少し複雑で、多くの人が実用的な価値がないと言っています.私がここで言いたいのも、このブログの冒頭で、このシリーズのブログはみんなにプロジェクトのやり方を教えるのではなく、思想を話していると言っています.そして、私たちが対象に向かう思想を理解すれば、多くの問題が解決されると信じています.
(3)最后に多くのブログに感谢して私のブログを読んで、みんなの支持に感谢して、あなた达の支持は私の动力です.
 
  
  Kencery 本シリーズの冒頭に戻る