加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_安阳站长网 (https://www.0372zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

.Net中的AOP系列之构建一个汽车租赁应用

发布时间:2016-10-28 18:29:15 所属栏目:教程 来源:站长网
导读:副标题#e# 返回《.Net中的AOP》系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看。 本系列的实验环境:VS 2013 Update 5(建议最好使用集成了Nuget的VS版本,VS Express版也够用

如果我们使用了不止一个数据层操作,为了使这些操作具有原子性,那么事务是必须的。也就是说,我们想要所有的数据层调用都成功(提交),要么都失败(回滚)。假设,我们可以将事务放到业务逻辑层。
假设底层的数据层会使用和.NET内置的事务类TransactionScope兼容的技术,结合try/catch块,我们可以给Accrue方法添加事务代码:

 public void Accrue(RentalAgreement agreement)
 {
     //防御性编程
     if (agreement==null)
     {
         throw new Exception("agreement为null!");
     }
     //日志
     Console.WriteLine("Accrue:{0}",DateTime.Now);
     Console.WriteLine("Customer:{0}",agreement.Customer.Id);
     Console.WriteLine("Vehicle:{0}",agreement.Vehicle.Id);
     using (var ts=new TransactionScope())//开始一个新事务
     {
         try
         {
             var rentalTimeSpan = agreement.EndDate.Subtract(agreement.StartDate);
             var numberOfDays = (int)rentalTimeSpan.TotalDays;
             var pointsPerDay = 1;
             if (agreement.Vehicle.Size >= Size.Luxury)
             {
                 pointsPerDay = 2;
             }
             var points = numberOfDays * pointsPerDay;
             //调用数据服务存储客户获得的积分
             _loyaltyDataService.AddPoints(agreement.Customer.Id, points);
             ts.Complete();//调用Complete方法表明事务成功提交
         }
         catch (Exception ex)
         {
             throw;//没有调用Complete方法,事务会回滚
         }
     }
     Console.WriteLine("Accrue Complete:{0}",DateTime.Now);
 }

(编辑:网站开发网_安阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!