一步一步搭建開發架構(五)單元工作模式

來源:互聯網
上載者:User

標籤: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

到此:資料庫訪問層的代碼基本處理完成!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.