近段时间有时间看看以前写的代码,系统有一个功能:用户的任意一个修改,删除操作都要进行日志记录,当时进度太赶,也只是知道 aop(关于什么是 aop 请自行google) 能处理这方面的问题,具体的还没接触 :( . --- 当时我的处理方式是将日志写为一个静态方法,然后在每个操作完成后加上: Log.write(用户ID, "操作信息") ;随着系统的增大,新的功能新的成员不断地加入, 问题就出现了.每个成员都会问:这个日志该怎么记录(虽然有文档,可总是感觉不太方便)?
近几天接触 PostSharp, 看看别人写的挺简单的,遂决定试一下(先前看过 Castle ,可它的动态代理好像只能在 virtual 方法上,不知道是我理解错了还是..否则就是 要用上 ioc....放弃).

就我所理解的,选用 PostSharp 的好处有:
1.采用 MSIL 静态代码注入,避免使用反射;
2.使用 MSBuild Task,使得开发人员可以像使用编译器内置 Attribute 那样使用 AOP;
3.可以拦截任意方法而不是局限于 virtual 方法;
4.对调用方法有更多的控制方法,比如输入参数,返回结果等

话会正题.开始前先到官网下载一个版本的 PostSharp(www.postsharp.org). 现在已经出了2.0 了,不过是45天的试用期,(过期收费?).装上试一下,它会在 vs2008 上面安插一个插件(这个暂不理会).真正到项目中使用的还是免费的好(我自己怎么为公司掏?),还是下个 1.5 的吧,关闭 vs 后安装.
新建一个 console 项目. 先模拟实现 Log:

日志模拟记录

    public static class Log
    {
        public static void Write(MethodExecutionEventArgs eventArgs,string message)
        {
            Console.WriteLine("开始日志记录.方法名: {0} , 实例名: {1}. 附带信息:{2}",
                eventArgs.Method.Name, eventArgs.Instance , message );
        }
    }

引用postsharp相关dll后(1.5: postsharp.laos ,postsharp.public  .2.0 就 postsharp ) 再实现某个类型的 attribute : 继承自 AttributeTargets (1.5 的namespace 是 PostSharp.public ,2.0 好像 PostSharp.Aspects )

注意:1.5和 2.0 方法签名不一样

    [Serializable]
    [global::System.AttributeUsage(AttributeTargets.All, AllowMultiple=true)]
    public class PostsAttribute  : OnMethodBoundaryAspect
    {
        /* PostSharp 2.0 里可用的方法
        public override void OnSuccess(MethodExecutionArgs args)
        {
            Console.WriteLine("...{0}...onsuccess......", DateTime.Now);
            base.OnSuccess(args);
            Log.Write(args);
        }
        */

private string _msg = string.Empty;
        public PostsAttribute(string message) {
            _msg = message;
        }

public override void OnEntry(MethodExecutionEventArgs args)
        {
            Console.WriteLine("...{0}...onEntry......", DateTime.Now);
            base.OnEntry(args);
        }

public override void OnExit(MethodExecutionEventArgs args)
        {
            Console.WriteLine("...{0}...OnExit......" , DateTime.Now);
            base.OnExit(args);
        }
    }

准备就绪后使用:

如何调用:

    class Start
    {
        static void Main() {
            Speak("我开始哈");
            EndSpeak();
            Console.ReadKey();
        }

[Posts("开始说话了..")]
        private static void Speak(string message) {
            Console.WriteLine(".{0}.....正式执行了....", message);
        }

[Posts("error:")]
        [onException("endspeak")]
        static void EndSpeak() {
            Console.WriteLine("会发生错误的调用......");
            throw new Exception("====== 这是故意发生的错误.===");
        }
    }

运行结果:

完整的 test 见源文件: 下载

安装文件下载:/Files/infozero/PostSharp安装文件.rar

使用PostSharp开始AOP相关推荐

  1. PostSharp AOP编程:1.基于PostSharp的AOP日志记录和异常捕捉【附带源码】

    AOP(基于切面编程):它是对业务逻辑的分离,使各个业务直接的耦合变低,比如在传统的OOP编程中将日志记录.异常处理.权限管理等方面剥离出来.在今后的维护过程中,对其改变日志记录.异常处理.权限管理方 ...

  2. PostSharp的AOP设计在.NET Remoting中的应用

    在.NET Remoting技术中实现用户的验证和授权并不那么容易,尤其是将其宿主在windows service这样的环境中的时候.大部分时候,我们都需要实现自定义的验证方式.具体来说也不是那么复杂 ...

  3. 使用PostSharp进行AOP框架设计:一个简单的原型

    AOP已经不是一个什么新名词了,在博客园使用关键字搜索可以查出n多条关于AOP的介绍,这里就不再赘述了. 在Bruce Zhang's Blog里面有很多关于AOP介绍及其在.net下实现研究,总觉得 ...

  4. 由浅入深CIL系列【目录索引】+ PostSharp AOP编程【目录索引】

    CIL简介:CIL(Common Intermediate Language)中文名为通用中间语言,注意它曾经被称为微软中间语言或MSIL,它是一种类似于JAVA字节码的语言.在微软语言平台中,不管程 ...

  5. 【ABP杂烩】面向切面编程(AOP)知识总结

    目录 1.存在问题 2.AOP的概念 3.AOP应用范围 3.AOP实现方式 4.应用举例 5.结束语 本文在学习[老张的哲学]系列文章AOP相关章节后,自己归纳总结的笔记. 1.存在问题 最近,其它 ...

  6. Net中的AOP系列之《将AOP作为架构工具》

    返回<.Net中的AOP>系列学习总目录 本篇目录 编译时初始化和验证 编译时初始化 切面验证的正确用法 真实案例:复习线程 架构约束 强制架构 真实案例:NHibernate 多播 类级 ...

  7. AOP在 .NET中的七种实现方法

    这里列表了我想到的在应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantages 缺 ...

  8. .NET静态代码织入——肉夹馍(Rougamo)

    肉夹馍是什么 肉夹馍通过静态代码织入方式实现AOP的组件..NET常用的AOP有Castle DynamicProxy.AspectCore等,以上两种AOP组件都是通过运行时生成一个代理类执行AOP ...

  9. Attribute鲜为人知的两个特性记录

    Attribute作为一种标记在我们的.net中随处可见,比如DatContract,DatMember,Serializable等等,各种用途的标记.是的我们的代码更加简洁,对于Attribute用 ...

最新文章

  1. LeetCode简单题之合并两个链表
  2. 如果孩子想学编程,你会推荐哪个? | 每日趣闻
  3. Lambda表达式介绍
  4. Tensorflow的高级封装
  5. 简历javaweb项目描述怎么写_硬件工程师简历-项目经验怎么写【范文】
  6. (10)Zynq IIC控制器介绍
  7. c++随机打乱数组_编程之路之php数组操作详解【文末有惊喜】
  8. android实机闪退,安卓模拟器,安卓真机,进入播放界面就会闪退
  9. 将Numpy数组保存为图像
  10. Linux文件系统之inode与软硬连接
  11. Asp.Net数据控件遍历
  12. 【Excel_007】利用excel进行线性规划求解
  13. 【论文阅读笔记】FCOS代码结合论文阅读
  14. 笔记本连接无线却找不到服务器,笔记本win7系统无线网络找不到无法连接wifi怎么办...
  15. Android kernel中wakeup_sources解析
  16. C指针原理(32)--C语言-pvm并行计算
  17. vue之axios封装
  18. dw在html中删除css样式表,DW里CSS的详细介绍
  19. 餐饮外卖平台小程序源码,附带详细教程
  20. matlab simulink 代数环问题解决

热门文章

  1. 树莓派上安装boost库
  2. shell 编程整合
  3. 移动端数据java后台接收
  4. [CareerCup] 16.5 Semphore 信号旗
  5. Git搭建自己的网站服务器(Linux)
  6. VS2005集成VSS2005的方法
  7. 训练MNIST数据集模型
  8. 基于Solr的空间搜索学习笔记
  9. 【译】Swift算法俱乐部-Boyer-Moore字符串搜索
  10. 继承之后的使用注意事项_ArrayStoreException