CSLA中业务层事务的实现
在企业级开发中,为保持业务数据的一致性,事务是经常需要用到的。
在CSLA框架中,有文章说只要给方法加上标签([Transactional(TransactionalTypes.TransactionScope)]),就可以实现。经过我的大量实践,这个标签没有作用。
我们最初使用的是SqlTransaction,将事务作为参数在方法之间传递,这样做会产生两个问题:
1.业务方法间的调用发生在数据访问层DAO,这样必然会将一些业务逻辑也写在数据访问层,业务逻辑层将失去应有的作用。
2.事务很难控制,代码量大,在调用其它业务方法时,不一定会有事务的参数。
解决办法是在业务逻辑层使用 TransactionScope(经量级事务),方法如下:
1.在工程中引用System.Transactions.dll
2.在类文件中引入命名空间using System.Transactions;
3.重写CSLA的方法,代码如下:
2 {
3 ResumeScore resumeScore = null;
4 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
5 {
6 resumeScore = base.Save();
7 ts.Complete();
8 }
9 return resumeScore;
10 }
2 {
3 Resume resume = null;
4 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
5 {
6 resume = base.Save();
7 if (this.ResumeScore != null)
8 {
9 this.ResumeScore.Save();
10 }
11 ts.Complete();
12 }
13 return resume;
14 }
在上述代码中,Resume的Save方法中调用ResumeScore的Save方法,这样业务处理就写在了业务层,并且实现了事务的处理。
说明, TransactionScope的说明与用法,请参考:http://www.cnblogs.com/zhangpengshou/archive/2009/07/20/1527269.html
注意:需要启动分布式事务及开启网络访问,可以查阅其它资料,如http://www.cnblogs.com/dengsu888666/archive/2007/04/02/696555.html