博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostSharp AOP编程:1.基于PostSharp的AOP日志记录和异常捕捉【附带源码】
阅读量:5920 次
发布时间:2019-06-19

本文共 3177 字,大约阅读时间需要 10 分钟。

        AOP(基于切面编程):它是对业务逻辑的分离,使各个业务直接的耦合变低,比如在传统的OOP编程中将日志记录、异常处理、权限管理等方面剥离出来。在今后的维护过程中,对其改变日志记录、异常处理、权限管理方法的时候,不用去改变主业务流程逻辑代码。提高开发效率。

        PostSharp采用特性的方式来对编译后的主业务流程方法逻辑横向静态注入截取数据。下面我们将以一个实例来演示如何使用PostSharp实现AOP进行日志记录和异常处理。

        首先需要安装PostSharp 2.1.4.1免费版本,这个版本只是功能相对较少,可商用,能够满足日志记录和异常截取的要求。点击 下载.

        

        然后新建一个控制台项目并将PostSharp.dll引入该项目中。编写一个截取日志的特性LogsAttributes.cs。

//日志特性截取类     [Serializable]     [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] class LogsAttribute:OnMethodBoundaryAspect     {
/// /// 入口参数信息 /// public string EntryText { get; set; } /// /// 出口参数信息 /// public string ExitText { get; set; } /// /// 异常信息 /// 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; } }

        下面是项目运行效果,如需源码请点击  下载。

       

转载地址:http://upivx.baihongyu.com/

你可能感兴趣的文章
为什么要学习Python及Python环境安装
查看>>
最大公约数与最小公倍数求解
查看>>
Java基础学习总结(20)——基础语法
查看>>
windows 2008 远程桌面
查看>>
JavaScript学习总结(5)——Javascript面向(基于)对象编程
查看>>
Oracle中用exp/imp命令参数详解
查看>>
CTK框架——CTK Widgets快速入门
查看>>
HyperLeger Fabric SDK开发(八)——msp
查看>>
hibernate连接数据库方言
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
查看>>
JNDI学习总结(2)——JNDI数据源的配置
查看>>
Java 使用 Redis
查看>>
关于java的wait、notify、notifyAll方法
查看>>
大型网站技术架构(一)大型网站架构演化
查看>>
执行server-start时emacs报错说"The directory `~/.emacs.d/server' is unsafe"
查看>>
Babel下的ES6兼容性与规范
查看>>
swift --字符串常用方法总结
查看>>
Redis应用学习(六)——主从复制
查看>>
Redis应用学习——Redis Cluster运维常见问题
查看>>