目录

  • 概念
  • 实现方式
  • .Net平台的切面实现
  • PostSharp示例

概念

  • Aspect-Oriented Programming(AOP):想想OOP是不是有些熟悉,AOP翻译过来的意思就是面向切面编程。先来关注一下涉及到的以下几个概念点。
  • 横切关注点: 存在于项目的绝大多数业务中可以通用的一些辅助性的功能。例如日志、安全、持久化等模块。它们存在于核心业务代码块的各个地方,却又独立于这些核心业务逻辑。 如图所示:

    Paste_Image.png
  • 切面: 这些横切关注点的统一抽象。
  • 所以面向切面编程,就是将项目的辅助性功能(如日志、异常处理、缓存处理等)与业务逻辑进行分离,把繁琐的辅助性代码抽离出来不用重复Copy,使得程序具备更高的模块化。

实现方式

  • 静态织入 即编译时织入,实现原理是对编译器做扩展,使得在代码编译时编译器将切面代码织入到指定的切点。
  • 动态织入 即运行时织入,编译器在编译时对切面代码和业务代码分别独立编译,而在运行的时候由CLR进行代码混合。

.Net平台的切面实现——PostSharp

  • 为什么选用PostSharp
    1. 轻量级的静态织入实现(可以通过反编译清晰的知道你的代码构成)
    2. 使用简单,独立编写切面类,更好的实现模块化,继承自PostSharp提供的各种切面类型的抽象类,并重写其中的拦截方法即可,可以像使用类库内置的Attribute那样使用AOP
    3. 对调用方法有更多的控制点,比如输入参数、返回结果、异常捕获等
    4. 但是,但是自从2.0版本之后就不免费了
  • PostSharp的切面类
    1. OnMethodBoundaryAspect,针对方法内的各种可能存在切点的情况进行代码注入,实现切面思想,提供了OnEntry,OnExit,OnSuccess,OnException等可重写的虚方法,顾名思义分别是在进入方法、退出方法、方法体成功执行、方法内发生异常的拦截。后续的实例是通过OnEntry来修改方法的输入参数来展示的。
    2. OnFiledAccessAspect,对Filed的读写进行拦截处理,提供了OnGetValue,OnSetValue的虚方法。
    3. OnExceptionAspect,实现异常的捕获。
    4. OnMethodInvocationAspect,方法调用拦截,提供OnInvocation虚方法。
    5. ImplementMethodAspect,用于extern方法、abstract类的方法进行拦截。
  • PostSharp的版本差异 3.0版本是个分水岭,目前最新版本是5.0.28,他们的使用方式有一小点差异。
    • 3.0版本之前下载了安装包,在项目中引用postsharp.dll,之后编码就可以了
    • 但是3.0之后是类似于VS插件的方式工作的,下载postsharp安装包安装之后会在vs的菜单中新增一个postsharp菜单(如下图),可以进行一些设置,在使用的时候不再是引用,而是需要项目上右击“添加postsharp到项目”

PostSharp示例

  1. 做前期准备工作,从PostSharp官网下载最新版本的安装包,并安装。
  2. 打开VisualStudio,新建解决方案,添加命令行项目。项目上右键后点击“Add PostSharp to project”后在弹出窗口按提示操作,会发现已经多了postsharp的引用。
  3. 添加AspectAttribute切面类,实现对核心方法的输入参数修改。需要注意的是postsharp提供的几种切面类型都是继承自Attribute基类,而且是通过对要实现拦截的类或方法添加特性的方式实现切面思想的。所以我们的切面类 需要按照约定以xxxAttribute的格式命名。

      [Serializable]
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class AspectAttribute : OnMethodBoundaryAspect
    {
    //方法进入时
    public override void OnEntry(MethodExecutionArgs args)
    {
    //修改输入参数
    args.Arguments[0] = "jingdong";
    //设置方法是否继续执行或退出,若设置的是FlowBehavior.Return方法会直接退出,不执行后续的所有代码。
    args.FlowBehavior = FlowBehavior.Continue;
    } //方法离开时
    public override void OnExit(MethodExecutionArgs args)
    {
    Console.WriteLine("exit");
    } //方法成功执行时
    public override void OnSuccess(MethodExecutionArgs args)
    {
    Console.WriteLine("success");
    }
    }
  4. 在program中添加我们的核心方法Start,打印输入参数。在需要实现拦截的方法添加上一个步骤中实现的切面类特性

      public class Program
    {
    static void Main(string[] args)
    {
    var arg = "tmall";
    Console.WriteLine($"original argument:{arg}");
    Start(ref arg);
    Console.Read();
    } [Aspect]
    static void Start(ref string arg)
    {
    Console.WriteLine($"real argument:{arg}");
    Thread.Sleep(1000);
    Console.WriteLine("finished");
    }
    }
  5. 由此就简单通过postsharp实现了对方法的拦截,修改输入参数,监听方法成功执行以及退出。看下执行结果,成功的篡改了输入参数,并且可以看出拦截方法的方法体是先于OnSuccess执行的,OnSuccess的拦截执行完成之后才是OnExit。
  6. 之前有说过postsharp是静态织入来实现AOP编程的,那么肯定是通过编译器在编译的时候对代码进行了织入,可以通过反编译exe文件来看下。

    可以看到start方法被加入了若干行代码。

  7. 有一个小点需要注意,使用postsharp的时候对切面类必须添加Serializable特性,否则在编译的时候就会报错。
  • 小结

    文章内的小例子主要是为了说明postsharp实现AOP的基本原理,以及实现过程。并没有如同实际项目中使用AOP来做一些日志、安全、持久化之类的辅助功能。

.NET 切面编程 PostSharp的更多相关文章

  1. # .NET切面编程——PostSharp

    目录 概念 实现方式 .Net平台的切面实现 PostSharp示例 概念 Aspect-Oriented Programming(AOP):想想OOP是不是有些熟悉,AOP翻译过来的意思就是面向切面 ...

  2. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  3. AOP面向切面编程C#实例

    原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...

  4. C# 中使用面向切面编程(AOP)中实践代码整洁

    1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则(在作者的前一本书<代码整洁之道>也是被大力阐释),而面向切面编程(Aop)作为面向对象 ...

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

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

  6. C# 中使用面向切面编程(AOP)中实践代码整洁(转)

    出处:https://www.cnblogs.com/chenug/p/9848852.html 1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则( ...

  7. Java 面向切面编程(Aspect Oriented Programming,AOP)

    本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架--AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下 ...

  8. AOP(面向切面编程概念,本文为翻译)

    AOP是什么 AOP为Aspect Oriented Programming的缩写.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用 ...

  9. C# 面向切面编程 AOP

    AOP(Aspect Oriented Programming) 面向切面编程 起源 引言  http://wayfarer.cnblogs.com/articles/241012.html AOP技 ...

随机推荐

  1. linux下centos7中mysql崩溃问题的解决

    ---恢复内容开始--- 出现错误: 尝试解决: 错误解释是说系统运行过程中丢失了pid:我最先想到是 可能磁盘满了:于是 df -h 检查了一下:磁盘并没有满! 于是我对/etc/my.cnf [m ...

  2. UWP 五星评价(不跳转到龟速商店)

    之前写过一篇文章  UWP 五星好评  代码如下 var pfn = Package.Current.Id.FamilyName; await Launcher.LaunchUriAsync(new ...

  3. AWK高端功能-数组

    第1章 awk命令基础 1.1 awk命令执行过程 1.如果BEGIN 区块存在,awk执行它指定的动作. 2.awk从输入文件中读取一行,称为一条输入记录.如果输入文件省略,将从标准输入读取 3.a ...

  4. Altium软件中Unknowpin的详细解决办法

    1.Altium软件中Unknowpin第一种原因:PCB封装缺失遗漏,直接加入对应的封装即可.点击箭头指示处的Add,接着点击OK之后,再点击图中所示处Browse...选择封装库的封装即可. 2. ...

  5. VM虚拟机安装CentOS 7.0添加jdk环境

    虚拟机注册码 5A02H-AU243-TZJ49-GTC7K-3C61N 安装centos系统,网络类型选择桥接网络安装完成后vi /etc/sysconfig/network-scripts/ifc ...

  6. Revit开发-设置对象样式

    最近需要读取RVT项目样板一些对象样式,翻了一下API,查找到下面的情况:

  7. 快速稀疏角点光流框架(Fast sparse corner optical flow framework)

    光流适用在连续的图像系列(视频流)中,描述本身或画面目标的运动状态:在目标跟踪.运动分析.甚至slam中都有广泛应用. opencv里就有不少光流算法,其中很经典也是当前被调用最多的的Lucas-Ka ...

  8. (转)CentOS7系统信息及运行情况查看

    原文链接:https://blog.csdn.net/qq_42196196/article/details/85063911 系统信息 CPU信息 内存信息 显卡信息 硬盘信息 网络信息 用户信息 ...

  9. 2018.4.23 linux系统

    linux: 1.代表linux的内核 2.代表linux的操作系统:linux的内核和工具软件.应用软件..办公工具.开发工具. 它的特点: 1.它是开源软件,时当今最成功的开源软件之一.所以很多的 ...

  10. 为 GlusterFS 设计新的xlator (编译及调用过程分析)

    GlusterFS 是一个开源的网络分布式文件系统,前一阵子看了一点GlusterFS(Gluster)的代码,修改了部分代码,具体是增加了一个定制的xlator,简单记录一下. Gluster与xl ...