postsharp初体验
首先,有必要先介绍下,什么叫做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(, ));
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文件中,新增程序集的特性


postsharp初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
随机推荐
- 【AStar】初赛第一场
1. All X1.1 基本思路k和c的范围都不大,因此可以考虑迭代找循环节,然后求余数,判定是否相等.这题还是挺简单的.1.2 代码 /* 5690 */ #include <iostream ...
- B/S 和 C/S
B/S最大优势为客户端免维护,适用于用户群庞大,或客户需求经长发生变化的情况. C/S功能强大,可以减轻服务器端压力,如果用户的需求特别复杂,用C/S. 全面: Client/Server是建立在局域 ...
- website architecture
如果在不仔细考虑网站架构的情况下就去做一个网站,这就像在没有规划行程前而去贸然旅行.你可能最终到了你的目的终点,但是你可能也不知道在这过程中,你已经走过了多少的弯路.做网站适用同样的道理.在开工之前, ...
- EF CodeFirst-----简单demo示例
关于EF CodeFirst的文章院子里有很多的学习资料,但大多数都是一些讲Model通过特性或是Fluent API与数据库之间形成映射的关系,看了相关的文章之后,Model如何映射到数据还是有些迷 ...
- HDu 3449 (有依赖的01背包) Consumer
题意: 有n件物品,对应有不同的价格和价值,这是典型的01背包.但现在有了一个限制,要买物品先买能装这件物品的特定的盒子,盒子的价值为0 代码理解得还不是太好,感觉这是一个“二重”的01背包.首先假设 ...
- 51nod1161 Partial Sums
开始想的是O(n2logk)的算法但是显然会tle.看了解题报告然后就打表找起规律来.嘛是组合数嘛.时间复杂度是O(nlogn+n2)的 #include<cstdio> #include ...
- 安装CouchbaseClient的过程中提示 Error 1935.An error occurred during the installation of assembly;Error:-1603 fatal error during installation
安装过程中提示报错 点击确定后 安装程序会接着回滚,又提示报错如下 Error 1935的解决方法是下载一个微软的补丁. http://support.microsoft.com/de ...
- urlrewrite 地址重写
环境: Maven 3.0.4 Urlrewrite 2.5.2 Myeclipse 8.6.1 借此机会顺便提一下 Maven Project 的创建,会了的朋友或还不想了解 Maven 的朋友,可 ...
- Java笔记之String
1. String s="a",t="b"; t.concat(s); 之后,t仍然是"b",而不是"ba",要使t是& ...
- python练习程序(c100经典例19)
题目: 一个数如果恰好等于它的因子之和,这个数就称为“完数”.例如6=1+2+3.编程找出1000以内的所有完数. def foo(a): sra=a; lis=[1]; while 1: for i ...