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ではどうすればいいのでしょうか.次のコードを見てください.
(2)SaveChangesメソッドをカプセル化すると,現在のスレッド内のコンテキストを直接取得し,コンテキストのSaveChangesメソッドを呼び出すことで,現在のスレッド内のすべてのエンティティの変更を直接データベースにコミットすることになり,上のコードを見てもほとんどの人が何も感じていない可能性があるが,これは何をしているのだろうか.この時私はBaseRepository(倉庫)の削除方法のdbを増やす仕事をしていました.SaveChanges()を削除すると、メリットがわかります.それは、私たちのデータベース・アクセス・レイヤが呼び出す方法は本当にデータベースに保存されていませんが、つまりSaveChangesをすべてDbSessionに入れて実現すれば、DbSessionは本当のセッションと見なすことができます.
(3)つまり,以前に何度も削除されたエンティティを呼び出した後(多くのテーブルを操作する)に,DbSessionでSaveChangesメソッドを呼び出すだけで,すべてのテーブルエンティティの変化をデータベースに格納することができる.
3.SaveChangesメソッドをDbSessionに配置するメリット
(1)ではSaveChangesメソッドをDbSessionに置くメリットは何でしょうか.プロジェクトの例を挙げてみましょう.BaseServiceに戻って倉庫を追加します.エンティティを追加すると、ユーザーを追加するエンティティを作成し、ビジネスにステータスを変更します.コードは次のようになります.
(2)ここでは、ビジネスシーンで多くのテーブルを操作する可能性があります.これまでの方法では、呼び出しのたびにSaveChangesが実行されていました.例えば、ユーザーを追加するとSaveChangersが必要になり、権限を支払うには1回かかります.そうすると、データベースと何度も対話します.では、SaveChangersメソッドをDbSessionに抽出することを考えます.
(3)SaveChangersをDbSessionに抽出すると,後で複数のエンティティを操作した後に直接DbSessionインプリメンテーションを呼び出すと,対応する上記の追加方法が実現される.
(4)このときDbSessionをカプセル化すると,SaveChangersの権利をデータベースアクセス層からビジネスロジック層に高め,ビジネスロジック層にSaveChangersメソッドを制御させ,データベースアクセス層にSaveChangersメソッドを行う必要がなくなり,これにより、1つのビジネスシーンで複数のテーブルを操作するのに1回のコミットが必要であることが保証され、データベースとのインタラクションの回数が減少します.
4.BaseServiceへの変更
(1)上記で説明したように、BaseServiceを修正します.修正された最終コードは以下の通りです.
(2)DbSessionパッケージは簡単であるが,単純ファクトリモードとSaveChangersメソッド(現在のセッションで重要な機能)を兼ね備えており,SaveChangersメソッドの簡単な数行のコードであるが,ここではユニットワークモード(UIntWork)というモードを実現した.
(3)ユニットワークモードとは、大量にデータベースに対する操作をデータベースに提出することであり、一連のデータベースに対する操作をユニットワークにカプセル化し、一度にユニットワークの中のすべての変更をデータベースに提出することである.これがユニットワークモードであり、その目的はデータベースとの相互作用の効率を高めることである.データベースとのインタラクションを減らす.
5.まとめ
(1)このブログは最后にいくつかのブロ友达が前にメッセージをくれた答えを出します.まず、私が书いたのは権限管理ですか.私の答えは間違いありませんが、あなたの前にはまだそこを見ていません.それは私がまだ底辺の情報を書いているからです.私たちが底辺を書いたとき、インタフェースのものとビジネスロジックはまだよくありませんか.
(2)私が今このプロジェクトをやっているのは少し複雑で、多くの人が実用的な価値がないと言っています.私がここで言いたいのも、このブログの冒頭で、このシリーズのブログはみんなにプロジェクトのやり方を教えるのではなく、思想を話していると言っています.そして、私たちが対象に向かう思想を理解すれば、多くの問題が解決されると信じています.
(3)最后に多くのブログに感谢して私のブログを読んで、みんなの支持に感谢して、あなた达の支持は私の动力です.
Kencery 本シリーズの冒頭に戻る
(冒頭) (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 本シリーズの冒頭に戻る