PostSharp AOP编程:1.基于PostSharp的AOP日志记录和异常捕捉【附带源码】
AOP(基于切面编程):它是对业务逻辑的分离,使各个业务直接的耦合变低,比如在传统的OOP编程中将日志记录、异常处理、权限管理等方面剥离出来。在今后的维护过程中,对其改变日志记录、异常处理、权限管理方法的时候,不用去改变主业务流程逻辑代码。提高开发效率。
PostSharp采用特性的方式来对编译后的主业务流程方法逻辑横向静态注入截取数据。下面我们将以一个实例来演示如何使用PostSharp实现AOP进行日志记录和异常处理。
首先需要安装PostSharp 2.1.4.1免费版本,这个版本只是功能相对较少,可商用,能够满足日志记录和异常截取的要求。点击PostSharp-2.1.4.1 下载.
然后新建一个控制台项目并将PostSharp.dll引入该项目中。编写一个截取日志的特性LogsAttributes.cs。
//日志特性截取类 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]class LogsAttribute:OnMethodBoundaryAspect {///<summary>/// 入口参数信息///</summary> public string EntryText { get; set; } ///<summary>/// 出口参数信息///</summary> public string ExitText { get; set; } ///<summary>/// 异常信息///</summary> public string ExceptionText { get; set; } //进入函数时输出函数的输入参数 public override void OnEntry(MethodExecutionArgs eventArgs) { Arguments arguments = eventArgs.Arguments; StringBuilder sb = new StringBuilder(); ParameterInfo[] parameters = eventArgs.Method.GetParameters();for (int i = 0; arguments != null && i < arguments.Count; i++) {//进入的参数的值 sb.Append( parameters[i].Name + "=" + arguments[i] + ""); }string message = string.Format("{0}.{1} Method. The Entry Arg Is:{2}", eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, sb.ToString()); Console.WriteLine(message); } //退出函数时的函数返回值 public override void OnExit(MethodExecutionArgs eventArgs) { Console.WriteLine(string.Format("{0}.{1} Method. The Result Is:{2}", eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.ReturnValue.ToString())); } //函数发生异常时记录异常信息 public override void OnException(MethodExecutionArgs eventArgs) { Console.WriteLine(string.Format("{0}.{1} Method. The Exception Is:{2}", eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.Exception.Message)); } }
再看看当出现异常时通过try{} catch{}处理异常,ExceptionAttribute.cs类捕捉并且处理异常:
//截取异常并且处理异常 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]class ExceptionAttribute:MethodInterceptionAspect {//调用本函数时截取异常 public override void OnInvoke(MethodInterceptionArgs args) {try {base.OnInvoke(args); }catch(Exception ex) { Console.WriteLine(string.Format("此方法异常信息是:{0}", ex.ToString())); } } }
在客户端编写两个方法来测试PostSharp是否静态注入并且捕获到相关信息,代码如下:
class Program {static void Main(string[] args) { Add(3, 5); Console.WriteLine("-------------------------------------------------------"); Subject(5, 12); Console.ReadLine(); } //此函数让我们看其输入参数和返回值的日志记录 [Logs] [Exception]public static int Add(int a, int b) {return a + b; } //此函数看我们的异常通过自定义Exception特性记录下来 [Logs] [Exception]public static int Subject(int a, int b) { throw new ArgumentException("减法出现异常,需要处理"); return a - b; } }
下面是项目运行效果,如需源码请点击 PostSharpAOP.zip 下载。
转载于:https://www.cnblogs.com/chengxingliang/archive/2011/11/21/2248436.html
PostSharp AOP编程:1.基于PostSharp的AOP日志记录和异常捕捉【附带源码】相关推荐
- Python基于改进YOLOv5的烟叶病害检测系统(附带源码)
Python基于改进YOLOv5的烟叶病害检测系统(附带源码) 1.背景 2.前言 3.烟叶数据集的采集 4.烟叶数据集的标注 5.烟叶检测训练&识别效果 6.病害数据集的采集 7.病害数据集 ...
- Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)
1.背景 指针式机械表盘具有安装维护方便.结构简单.防电磁干扰等诸多优点, 目前广泛应用于工矿企业.能源及计量等部门.随着仪表数量的增加及精密仪表技术的发展,人工判读已经不能满足实际应用需求.随着计算 ...
- Spring AOP编程-传统基于aspectJ切点AOP开发
1.在配置文件上方增加aop相关配置. 2.在spring的配置文件中定义目标与通知. 3.使用aop:xxx标签来完成切面与切点声明. 4.我们使用aspectj的切面声明方式 需要在导入aspec ...
- 【Python游戏】用Python基于centernet在win10平台开发,射击游戏 | 附带源码
相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复射击游戏 Pytho ...
- 旅行时间和花费c语言编程,C语言顺序结构
-C语言计算旅行花费(附带源码)
国庆节桐桐一家想自驾旅游,目的地有北京.海南.云南等许多好玩的地方可选择.在已知汽车平均行驶速度.每升汽油可以行驶的距离(公里)以及每升汽油价格的情况下,你能计算出自驾去每一个地方所花费的时间和购买汽 ...
- 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)
文章目录 一.项目介绍 二.代码及报告获取 一.项目介绍 基于Vue.js的移动端购物商城网站(含源码.课设报告),代码获取放在文末了,码字不易,感谢点赞~ 一.系统概述 本部分主要是对项目进行简要描 ...
- 计算机毕业设计Python+uniapp基于微信小程序的旅游系统论文(小程序+源码+LW)
计算机毕业设计Python+uniapp基于微信小程序的旅游系统论文(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ ...
- java毕业设计——基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码)——基于纠错码的冗余技术
基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+EVENODD编码的基于纠错码的冗余技术设计与实现,文章末尾附有本毕业设计的 ...
- 计算机毕业设计ssm基于协同过滤算法的甜品推荐系统uhnk3系统+程序+源码+lw+远程部署
计算机毕业设计ssm基于协同过滤算法的甜品推荐系统uhnk3系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于协同过滤算法的甜品推荐系统uhnk3系统+程序+源码+lw+远程部署 本源码技术栈 ...
最新文章
- 【Python】调用百度云API人脸搜索服务 Face Search
- OpenCV findContours和drawContours用法的实例(附完整代码)
- Oracle 11g创建Interval分区表
- kgtemp文件转换mp3_amr转换mp3格式文件
- “约见”面试官系列之常见面试题之第七十九篇之ES5和ES6(建议收藏)
- SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
- linux驱动与windows驱动精灵,细说驱动精灵和驱动人生哪个好
- 怎么用计算机进行进制间的换算,如何实现16进制与其他进制之间的转换,教你使用16进制计算器...
- 日了。这个竟然还不让发
- 十六、Swift 可选值链条 Optional Chaining
- 向日葵 11.0.0.34335 中文版 (老牌国产远程控制软件)
- OpenFoam-6 导入并编译一个新湍流模型
- ker矩阵是什么意思_第五课:初等矩阵及酉矩阵
- 选对Shopee货代对店铺影响有多大?星卓越货代系统为您分析
- 大数据和云计算技术周报(第182期)
- 知名技术团队博客网站
- shell中的并且、和、或者
- Godaddy申请退款
- 利用前三年的数据预测2018年NBA常规赛东西部前八的详细过程和解决思路(19年类似)
热门文章
- 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(三)
- 【深度学习】深入浅出transformer解决并行计算问题
- python【力扣LeetCode算法题库】58-最后一个单词的长度
- sleep interrupted异常_Java高并发3中断线程以及isInterrupted与interrupted区别
- python arma_Python ARIMA
- 如何做网络推广浅析在网站优化中如更换域名该如何避免降权风险?
- 长沙网络推广浅析影响网站快照更新时间的因素是什么?
- 网络营销外包专员浅析从用户角度出发如何完善网络营销外包?
- 网络推广专员浅析网络推广期间网站收录如何提升?
- c语言中如何自定义sort,c – 如何重载自定义std :: sort比较函数?