首先,有必要先介绍下,什么叫做AOP(Aspect-Oriented Programming,面向切面编程)。下图是百度的词条解释

用图来解释可能更直接了当些:

ps:图片来自http://www.cnblogs.com/leoo2sk/archive/2010/11/30/aop-postsharp.html

简单的说,AOP是一种独立于系统业务逻辑的贯穿整个系统的横切关注点,比如异常处理,日志的记录等。

--------------------------------------------------------------------------------------------------------------------------

之前在项目中,经常碰到的问题是:如何给所有的方法都加上一个统一的异常处理的方法,特别是cs模式的(bs模式比较简单,可以通过在Global文件中捕获异常,并记录)。另外之前面试时,也被问到类似的问题,当时我思考了很长时间,还是想不出什么好的办法。后来今天看MVC4 web编程一书时,文中提到可以通过特性来统一记录异常日志。于是,我欣喜若狂,赶紧百度相关的技术的文章,发现了一个非常好用的AOP的插件,也就是这篇文章的主角:PostSharp

1. 下载PostSharp(https://www.postsharp.net/)。现在版本已经更新到4.1。1.5是免费的,大于2.0的版本都是收费的。我下了个3.0的版本及其keygen。有需要的加我q(371323761)

2. 安装PostSharp。过程很简单,按照其流程即可。按照后,打开keygen,生成License即可。

3. 打开vs,右键项目,选择Add PostSharp to project,如下图,接下来便可以用PostSharp来写些AOP的应用了

----------------------------------------------------------------------------------------------------------------

比如我们想对每个类的每个方法做异常日志记录

1. 定义日志记录类

namespace CustomAttribute
{public interface ILog{void log(string msg);}
}

[Serializable]public class Logger:ILog{public void log(string msg){string path = Environment.CurrentDirectory + "\\" + string.Format("systemlog/{0}/{1}/{2}", "error", DateTime.Now.Year, DateTime.Now.Month);if (!Directory.Exists(path)){Directory.CreateDirectory(path);}string logPath = path + "/" + DateTime.Today.ToString("yyyy-MM-dd") + ".txt";if (!File.Exists(logPath)){var file = File.Create(logPath);file.Close();}StreamWriter sw = new StreamWriter(logPath, true);sw.WriteLine(msg);sw.Flush();sw.Close();}}

2. 定义异常日志记录的特性

[Serializable][AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]public class ExceptionLogAttribute : OnMethodBoundaryAspect{private ILog logger;//通过依赖注入的方式解耦public ExceptionLogAttribute(ILog log){logger = log;}public override void OnException(MethodExecutionArgs args){base.OnException(args);logger.log(string.Format("{0}:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), args.Exception.Message));}}

[Serializable][AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]//AttributeTargets.Method说明该特性是应用到方法上的
public sealed class MyExceptionLogAttribute:ExceptionLogAttribute { public MyExceptionLogAttribute() : base(new Logger()) { } }

3. 应用特性到方法上

class Program{static void Main(string[] args){Console.WriteLine(Divide(1, 0));Console.ReadLine();}[MyExceptionLog]private static int Divide(int a, int b){return a / b;}}

4. 结果

PostSharp还有很多用处,日后再慢慢挖掘。

很喜欢PostSharp官网上的一句话:

Start writing cleaner code today!

以前写代码总是关注于如何实现功能,后来慢慢学会用设计模式重构代码,现在懂得了AOP(postsharp),便可以从另外一个角度,以更优雅的方式写代码。

------------------------

问题1:如果想对类的所有方法定义统一的异常日志记录的特性,怎么办呢?

如果把特性Targets定义为All或class,可以捕获该类的所有的方法的异常

问题2:如果想对程序集(dll)中每个方法定义异常日志记录的特性,怎么呢?

把特性的Targets定义为all或Assembly,然后在AssemblyInfo.cs文件中,新增程序集的特性

转载于:https://www.cnblogs.com/xingluzhe/p/4738150.html

postsharp初体验相关推荐

  1. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  2. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  3. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  4. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  5. 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...

  6. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  7. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  8. Spring环境搭建,IoC容器初体验~

    由于最近的任务是关于IoC配置文件格式的转换,所以需要从Spring的IoC容器开始学起,今天根据网上的介绍搭建了Spring环境,并对其IoC容器进行了初体验.文章中涉及到的软件以及推荐的一本关于S ...

  9. 来自新手Banana Pi香蕉派初体验

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 一段时间来对有强大的技术支持和完善的社区的Raspberry Pi很感兴趣,本想入一片学习学习,但转念一想Raspb ...

最新文章

  1. JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用
  2. 比较难发音的英语音标音符_音素_英语发音
  3. 原来js的parseInt函数还可以这样用
  4. SSIS变量属性中EvaluateAsExpression设置的作用
  5. 已饱和!未来程序员没活路了...
  6. printf(%d,5.01)和printf(%f,5)的输出结果
  7. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_4_使用Lambda优化日志案例...
  8. Spring IOC注入详解
  9. everything的安装后初始设置
  10. c语言编程怎样进行反函数计算器,反函数计算器
  11. 爬虫实战 -- QQ音乐爬取全部歌曲
  12. NX_UG1872安装
  13. 类似818tu.c微信小说分销系统设计之多公众号网页授权自动登录源码分享
  14. 车辆有效信息的识别 车牌车型车颜色 车标识别,基于mallab算法
  15. 基于三菱PLC的两轴圆弧插补
  16. 超声波测距模块工作原理
  17. oppo小布机器人_看这一篇就够了,1分钟带你了解OPPO小布的隐藏玩法!
  18. python数星星问题
  19. Android Device Moniter部分问题的解决办法:
  20. 计算机网络第一章(概述)

热门文章

  1. VTK:Utilities之FileOutputWindow
  2. VTK:直线网格之RGrid
  3. OpenCV与FLANN的功能匹配
  4. Qt Creator嵌入式平台
  5. OpenGL 位图字体渲染的实例
  6. OpenGL 混合Blending
  7. C++newton raphson method牛顿拉夫森法的实现算法(附完整源码)
  8. QT的QOpenGLDebugLogger类的使用
  9. php计算200以内偶数的和并输出_如何用PHP实现数组中偶数位置元素大于奇数位置元素?...
  10. 「Self-driving: Perception」感知总览