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

就这个例子来说,这样没问题了,但是对于一个大一点的应用,可能会有几十个甚至几百个不同的类型,如果需求是记录实体Id和信息,那么可以在实体上使用一个公共接口(或基类)。比如,如果InvoiceRentalAgreement都实现了ILoggable接口,该接口具有一个方法string LogInfo(),代码可以这样写:


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

            }
        }

现在AccureRedeem方法开始收缩了,因为我们将logging功能移到了它自己的类日志切面中去了。

重构防御性编程

下面还是使用OnMethodBoundaryAspect基类重构防御性编程,确保没有参数为null,以及所有的int参数不为0或负数:

 [Serializable]
 public class DefensiveProgramming:OnMethodBoundaryAspect
 {
     public override void OnEntry(MethodExecutionArgs args)
     {
         var parameters = args.Method.GetParameters();//获取形参
         var arguments = args.Arguments;//获取实参
         for (int i = 0; i < arguments.Count; i++)
         {
             if (arguments[i]==null)
             {
                 throw new ArgumentNullException(parameters[i].Name);
             }
             if (arguments[i] is int&&(int)arguments[i]<=0)
             {
                 throw new ArgumentException("参数非法",parameters[i].Name);
             }
         }
     }
 }

首先检查实参是否为null,之后再判断参数是否是整型,并且是否合法。如果不处理这些事情,非法值会使得程序崩溃,但这里处理之后我们可以看到崩溃的确定原因(ArgumentNullException或ArgumentException 的异常信息)。

同时,这个类没有直接耦合任何参数类型或服务类,这意味着可以重复使用在多个服务中。

[LoggingAspect]
[DefensiveProgramming]
public void Accrue(RentalAgreement agreement)
{
    //...略
}

[LoggingAspect]
[DefensiveProgramming]
public void Redeem(Invoice invoice, int numberOfDays)
{
    //...
}

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

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