業務邏輯層的設計(三)——事務的考慮


本文討論面向對象程序語言中,事務管理的思想。

 

注意:本文代碼中涉及到事務管理的上下文,是我探索ORM原理時自制的上下文,讀者只要看着去理解他的意思就好了,實戰當中我用的是另外開源框架中的上下文。

 

事務管理應該放在哪一層做

事務的開始與提交應該放在哪里呢?業務邏輯層還是數據訪問層?

我以為,數據訪問層需要,業務邏輯層也需要。

這樣業務層就可以組合倉儲的數據庫操作,隨意組合成一個事務,而倉儲才可以被重用。

那么具體如何實現呢?


業務層的事務,這里引入了System.Transactions命名空間,userRep.Save(user2);這段就是剛才看到的,包含了一個事務的倉儲,

執行tx.Complete();才會走完這個事務,如果在using中出現了異常,那么所有事務都將回滾。

        [Test]
        public void TranTest()
        {
            IDataContext context = DataContextFactory.GetDataContext();
            Department dept = context.Get<Department>(1);
            User user1 = new User() { LoginName = "adama1", Name = "adama1", Password = "123123", Department = dept };
            User user2 = new User() { LoginName = "adama2", Name = "adama2", Password = "123123", Department = dept };
            IUserRepository userRep = RepostoryFactory.GetFor<User>() as IUserRepository;
            using (TransactionScope tx = new TransactionScope()) { context.Add(user1); userRep.Save(user2); tx.Complete(); }         }

注:使用TransactionScope可能會將事務升級為分布式事務。

 

在Java EE中,我見過事務管理出現在DomainService,也見過它出現在MVC的Controller,SpringMvc整合Hibernate后以注解的形式出現。

 

然而,在.NET中,也有MVC+Spring.NET+NHibernate,只不過與微軟MVC整合得不完全,需要手動為每個控制器寫XML配置,好在MVC提供我們擴展的功能,我們可以利用反射機制免去手動寫XML配置。

現在我已經完成了整合,這不是演習代碼,如下圖:

Repository

Repository

Service

Service

MVC Controller

Controller

 

UI

UI

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM