AOP之PostSharp初见-OnExceptionAspect-阿里云开发者社区

开发者社区> 技术小胖子> 正文

AOP之PostSharp初见-OnExceptionAspect

简介:
+关注继续查看

PostSharp 这个静态植入的aop框架我就不多说了,在以前的aop文件,我们也尝试用MSBuild+Mono.Cicel理解静态植入AOP的原理。最近公司准备购买Postsharp做一些AOP,减少开发是代码量,至于选择AOP相信也不用多说。我也在今天重新了解了些Postsharp最新版更新,这阵子的博客更新也少了,所以准备在MSBuild+Mono.Cicel的基础上再一些Postsharp系列。今天既然是初见,那么我们就从最简单的OnExceptionAspect开始。

一:OnExceptionAspect

起定义如下:

先写Aspect Attribute:


  1. View Code   
  2.  
  3. [Serializable]   
  4.     public class ExceptionAspectDemoAttribute : OnExceptionAspect   
  5.     {   
  6.  
  7.         public override void OnException(MethodExecutionArgs args)   
  8.         {   
  9.             var msg = string.Format("时间[{0:yyyy年MM月dd日 HH时mm分}]方法{1}发生异常: {2}\n{3}", DateTime.Now, args.Method.Name, args.Exception.Message, args.Exception.StackTrace);   
  10.             Console.WriteLine(msg);   
  11.             args.FlowBehavior = FlowBehavior.Continue;   
  12.         }   
  13.         public override Type GetExceptionType(System.Reflection.MethodBase targetMethod)   
  14.         {   
  15.             return typeof(NullReferenceException);   
  16.         }   
  17.     }  
  18. 复制代码 

注意Postsharp的Aspect都需要标记为可序列化的,因为在编译时会为我们二进制序列化为资源,减少在运行是的开销,这个将在后面专门讲。

上面的code继承至OnExceptionAspect,并且override OnException和GetExceptionType,GetExceptionType为我们需要处理的特定异常。OnException为异常处理决策方法。我们的异常处理决策是当NullReferenceException时候我们会记录日志,并且方法指定继续(args.FlowBehavior = FlowBehavior.Continue)。

看看我们的测试代码:


  1. View Code   
  2.  
  3. class Program   
  4.    {   
  5.        static void Main(string[] args)   
  6.        {   
  7.            Program.ExceptionAspectDemoAttribute1();   
  8.            Program.ExceptionAspectDemoAttribute2();   
  9.            Console.Read();   
  10.        }   
  11.        [ExceptionAspectDemo]   
  12.        public static void ExceptionAspectDemoAttribute1()   
  13.        {   
  14.            string s = null;   
  15.            s.GetType();   
  16.        }   
  17.        [ExceptionAspectDemo]   
  18.        public static void ExceptionAspectDemoAttribute2()   
  19.        {   
  20.            throw new Exception("exception");   
  21.        }   
  22.    }  
  23. 复制代码 

很显然我们的两个方法抛出了null异常和自定义异常,预期是NullReferenceException会被扑捉,而自定义异常会中断,运行效果如下:

我们在来看看postsharp为我们做了什么,当然是反编译看看:

 

二:Postsharp的Multicasting

1:Multicasting class:

  在这随便也说一下postsharp的Multicasting,多播这样翻译感觉有点死板呵呵,理解就行。利用这一点我们可以吧我们的aspect放在class,assembly等目标上匹配我们的多个目标。比如现在我们不想在我们的每个方法上加attribute,那我们可以选择在class上,如:

反编译,同样注入了我们每个方法:

 

2:Multicasting assembly:

我们同样可以利用

[assembly: PostSharpDemo.ExceptionAspectDemoAttribute()]

标记在我们的程序集上。

3:AttributeExclude:

但是注意这样也标记了我们的aspect,某些时候可能会导致堆栈溢出 ,我们可以用AttributeExclude=true来排除。

同时我们也可以设置应用目标:AttributeTargetMemberAttributes是一个枚举类型,定义如下:

比如我们需要过滤编译时候生成的目标(自动属性,action等等),

[assembly: PostSharpDemo1.MethodTraceAspect(AttributeExclude = true, AttributePriority = 0, AttributeTargetMemberAttributes = MulticastAttributes.CompilerGenerated)]

 4:AttributePriority:

还有AttributePriority,我们可以设置编译时优先级。如果我们对目标标记了多个aspect,这样postsharp就不确定注入先后顺序,这样不能确保正确性,在vs编译时候我们会看见警告:Their order of execution is undeterministic.

这是时候AttributePriority就派上用途了来决定我们植入的先后优先级。

5:其他匹配

同上AttributeTargetMemberAttributes 我们还可以利用AttributeTargetMembers,AttributeTargetTypes进行目标名称的匹配,支持模糊匹配。

附件:Demo下载

我的AOP资料:





 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835264,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10099 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2512 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13897 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9161 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7366 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4511 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
22416 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载