標籤:style blog http color os io 資料 for
1,單元工作模式主要為了提高與資料庫的互動次數,提高應用程式效率。我們知道實際的業務操作中,有時需要好幾張表一快儲存,一塊刪除之類的邏輯,比如註冊使用者之後,使用者表要加一條資料,積分表等與使用者表有外鍵關係的表可能也需要儲存資料,這樣造成多次儲存,也就是多次與資料庫互動。
2,前邊我把SaveChange()方法都寫到了BaseDal裡面,今晚上就把這個SaveChange方法提取出來!我們繼續封裝一個DbSession類,同時將抽象工廠的代碼轉移到這個DbSession類中。
1 namespace PCITC.OA.DalFactory 2 { 3 public class DbSession 4 { 5 private static string assemblyName = ConfigurationManager.AppSettings["Assembly"].ToString(); 6 private static string spaceName = ConfigurationManager.AppSettings["NameSpace"].ToString(); 7 public static object GetInstance(string assemblyName, string typeName) 8 { 9 return Assembly.Load(assemblyName).CreateInstance(typeName);10 }11 public IUserInforDal UserInforDal 12 {13 get14 {15 return GetInstance(assemblyName, string.Format("{0}.{1}", spaceName, "UserInforDal")) as IDal.IUserInforDal;16 }17 }18 public IRoleDal RoleDal19 {20 get21 {22 return GetInstance(assemblyName, string.Format("{0}.{1}", spaceName, "RoleDal")) as IDal.IRoleDal;23 }24 }25 public int SaveChange()26 {27 DbContext dbContext = EFDBContextFactory.GetCurrentDbContext();28 return dbContext.SaveChanges();29 }30 31 }32 }View Code
從代碼上可以看到,SaveChange()方法寫在了DbSession類中,在上一篇部落格中已經對EF上下文執行個體進行了管理,所以SaveChange方法中的內容物件就是我們當前線程中的內容物件,通過在商務邏輯層由我們自己控制什麼時候商務邏輯處理完成,什麼時候調用SaveChange方法。做到批量提交的效果。
3,SaveChange方法被調用時會啟動一個事務,一條儲存失敗,所有資料都儲存失敗。所以,我們就可以將BaseDal中的SaveChange方法全部刪除,在商務邏輯層根據Savechange的結果,自己判斷是否儲存成功。
4,還有個問題,由於DbSession中封裝了所有的Dal,所以DbSession的執行個體也要維護一下,否則如果建立多個DbSession類的話,會造成大量Dal執行個體的建立,同時由於擷取Dal的執行個體是通過反射擷取的,如果不維護一下,會造成大量效能的浪費!
5,DbSession類線程內執行個體唯一。通過簡單工廠和CallContext類實現,與EF上下文執行個體管理類似。
1 namespace PCITC.OA.DalFactory 2 { 3 public class DbSessionFactory 4 { 5 public static IDal.IDbSession GetCurrentDbSession() 6 { 7 IDal.IDbSession dbSession = (IDal.IDbSession)CallContext.GetData("DbSession"); 8 if (dbSession==null) 9 {10 dbSession = new DbSession();11 CallContext.SetData("DbSession",dbSession);12 }13 return dbSession;14 }15 }16 }View Code
6,這個時候商務邏輯層擷取DbSession類的代碼就變成了:
1 namespace PCITC.OA.Bll 2 { 3 public class UserInforService 4 { 5 private IDbSession dbSession = DbSessionFactory.GetCurrentDbSession(); 6 public UserInfor Add(UserInfor userInfor) 7 { 8 return dbSession.UserInforDal.Add(userInfor); 9 }10 }11 }View Code
到此:資料庫訪問層的代碼基本處理完成!