加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_安阳站长网 (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版也够用

先来重构一个简单的横切关注点:logging。当方法调用时,会记录方法名和时间戳。创建一个日志切面类,继承自OnMethodBoundaryAspect,它允许我们在方法的边界插入代码:

[Serializable]
public class LoggingAspect:OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine("{0}:{1}",args.Method.Name,DateTime.Now);
    }

    public override void OnSuccess(MethodExecutionArgs args)
    {
        Console.WriteLine("{0} complete:{1}",args.Method.Name,DateTime.Now);
    }
}

注意,我们可以通过MethodExecutionArgs参数获得方法名,因此,这个切面可以c重复使用,可给AccureRedeem方法使用:

public class LoyaltyAccrualService:ILoyaltyAccrualService
{
    [LoggingAspect]
    public void Accrue(RentalAgreement agreement)
    {
        //...
    }
}

 public class LoyalRedemptionService:ILoyaltyRedemptionService
 {
     [LoggingAspect]
     public void Redeem(Invoice invoice, int numberOfDays)
     {
         //...
     }
 }

现在就可以从这些方法中移除logging代码了。除此之外,我们还没有打印传入参数的Id,比如Customer.Id。有了Postsharp,我们可以取到所有的传入参数,但为了取到Id,必须还得做点事情。


public override void OnEntry(MethodExecutionArgs args)
{
    Console.WriteLine("{0}:{1}",args.Method.Name,DateTime.Now);
    foreach (var argument in args.Arguments)//遍历方法的参数
    {
        if (argument.GetType()==typeof(RentalAgreement))
        {
            Console.WriteLine("Customer:{0}", ((RentalAgreement)argument).Customer.Id);
            Console.WriteLine("Vehicle:{0}", ((RentalAgreement)argument).Vehicle.Id);
        }
        if (argument.GetType()==typeof(Invoice))
        {
            Console.WriteLine("Invoice:{0}",((Invoice)argument).Id);
        }
    }
}

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

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