AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

实现AOP主要由两种方式,一种是编译时静态植入,优点是效率高,缺点是缺乏灵活性,.net下PostSharp为代表者(这个是收费的)。

另一种方式是动态代理,优缺点与前者相反,动态为目标类型创建代理,通过代理调用实现拦截。

Spring框架用的核心技术就是AOP,是函数式编程的一种衍生范型。利用AOP的好处就是可以对业务逻辑进行隔离,降低耦合度,提高程序的可重用性,同时提高了开发的效率。

AOP在我理解来说就是一种编程思想和架构设计,AOP是OOP面向对象编程的延续,是软件开发中的一个热点。AOP的简称叫”面向切面“编程,即在现有的代码里横向的切分开来进行相应处理,比如说MVC里的刷选器(过滤器)。

AOP主要功能是将系统中非核心的公共业务提取出来,进行单独处理。比如日志记录、性能统计、安全控制、事务处理、异常处理等等。

AOP主要意图是将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

下面介绍一些.NET相关的AOP框架

1. PostSharp(编译时静态植入)是最有名且使用率较高的一个,但是在Nuget上的版本是需要付费的(2.0)以上都要付费。

2. Spring.Net  用于解决企业应用开发复杂性的一种容器框架,它实现了控制反转IOC和依赖注入DI,通俗解释就是通过spring.net框架的容器来创建对象实体,而不是通过程序员new出来,

降低程序对服务类的依赖性,提高软件的可扩展性。只要在spring.net的相应xml中配置节点,创建容器上下文后再通过配置获取对象就可以。

3. Autofac 是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器),加上AOP简直是如虎添翼。Autofac的AOP是通过Castle(也是一个容器)项目的核心部分实现的,名为Autofac.Extras.DynamicProxy,

顾名思义其实现方式为动态代理。

4. Castle.Core 本质是创建继承原来类的代理类,重写虚方法实现AOP功能。

5. KingAOP 开源框架KingAOP是基于动态类型进行操作和绑定的。

个人推荐使用Castle.Core 或者 KingAOP

下面介绍一个比较精简的AOP框架:KingAOP 使用方式比较简单,如下顺序:

1、在Nuget上搜索KingAOP,如图:

或者通过命令安装:

Install-Package KingAOP

2、创建一个刷选器类(切面处理类),继承OnMethodBoundaryAspect,并重写相关的事件,如下代码:

    /// <summary>
/// 创建一个刷选器类(切面处理类)
/// </summary>
public class AopFilter : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Console.WriteLine("call-------->AopFilter------>OnEntry");
base.OnEntry(args);
} public override void OnException(MethodExecutionArgs args)
{
Console.WriteLine("call-------->AopFilter------>OnException");
base.OnException(args);
} public override void OnSuccess(MethodExecutionArgs args)
{
Console.WriteLine("call-------->AopFilter------>OnSuccess");
base.OnSuccess(args);
} public override void OnExit(MethodExecutionArgs args)
{
Console.WriteLine("call-------->AopFilter------>OnExit");
base.OnExit(args);
}
}

3、创建一个类,该类的方法注册上面新建的刷选器,如下代码:

    /// <summary>
/// 该类需要继承IDynamicMetaObjectProvider,因为KingAOP是基于动态类型进行操作和绑定的,如不继承是不会进入到刷选器中的相应事件里
/// </summary>
public class SimonDemo : IDynamicMetaObjectProvider
{
public SimonDemo()
{
Console.WriteLine(" Call 'SimonDemo类' - 'Constructor(构造函数)'");
} [AopFilter]
public void Operate()
{
Console.WriteLine("Call 'SimonDemo类' - 'Operate方法' ");
} /// <summary>
/// 该类必须实现IDynamicMetaObjectProvider的GetMetaObject方法
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public DynamicMetaObject GetMetaObject(Expression parameter)
{
return new AspectWeaver(parameter, this);
}
}

上面的SimonDemo类需要继承IDynamicMetaObjectProvider,因为KingAOP是基于动态类型进行操作和绑定的,如不继承是不会进入到刷选器中的相应事件里。

该类必须实现IDynamicMetaObjectProvider的GetMetaObject方法,同时在需要切面的方法上用属性[AopFilter]进行标注,

同时,刷选器属性是限制了只能对应方法,且不包含构造函数;

4、接下来就是测试代码,如下

static void Main(string[] args)
{
//简单例子
Console.WriteLine("Call Main ..");
//注意:如果需要用KingAop进行横向切面则必须在实例化被切面的类时用动态类型dynamic接收
dynamic simon = new SimonDemo();
simon.Operate();
Console.WriteLine("exit Main ..");
Console.Read();
}

上面的代码执行后是这个样子的,如下图:

仔细看代码SimonDemo是以动态类型 dynamic来接收的,我们把代码改成SimonDemo simon = new SimonDemo();后执行会怎么样?如下图:

实践后发现,如果需要用KingAop进行横向切面则必须在实例化被切面的类时用动态类型dynamic接收。

整体而言,这个框架还是挺简单的

C#使用KingAOP实现AOP面向切面编程一的更多相关文章

  1. spring-第十六篇之AOP面向切面编程之Spring AOP

    1.上一篇介绍了AspectJ在AOP的简单应用,让我们了解到它的作用就是:开发者无需修改源代码,但又可以为这些组件的方法添加新的功能. AOP的实现可分为两类(根据AOP修改源码的时机划分): 1& ...

  2. C#使用KingAOP实现AOP面向切面编程二

    本文继续上篇讲述一下比较复杂点的AOP例子,先新建一个控制台项目,然后同样先在Nuget中搜索安装KingAop到项目中 1.项目结构 2 .定义一个登录实体类User和LoggingAspect切面 ...

  3. spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用

    1.去官方网站下载aspectj-1.8.0.jar 2.在jar包目录启动cmd,执行java -jar aspectj-1.8.0.jar,Next 3.检查JAVA_HOME路径是否正确,如果不 ...

  4. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  5. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  6. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  7. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  8. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  9. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

随机推荐

  1. js new call apply bind 的 原理

    new new 做了什么事?1. 以 Object.protoype 为原型创建一个新对象 2. 以新对象为 this,执行函数的 [[call]] 3. 如果 [[call]] 的返回值是对象,那么 ...

  2. js的模块化之路

    在ES6之前,官方没有出来import export这种模块化的语法. 为了提高代码复用.避免污染全局,民间写了很多模块化的实现: 1. 立即执行函数 (function(globalVariable ...

  3. base/7/x86_64/filelists_db FAILED

      解决办法: [root@localhost ~]# cd /var/lib/rpm [root@localhost rpm]# rm -rf __db.* # 清除原 rpmdb 文件 [root ...

  4. codeforces#1228E. Another Filling the Grid(容斥定理,思维)

    题目链接: https://codeforces.com/contest/1228/problem/E 题意: 给n*n的矩阵填数,使得每行和每列最小值都是1 矩阵中可以填1到$k$的数 数据范围: ...

  5. S标签的CheckBox显示和回显

    var ytfl=document.getElementsByName("jcrwModel.ytfl"); var jg='${jcrwModel.ytfl}';    for( ...

  6. sql server 发布订阅

    [配置] 一. 发布方 复制 >> 如果有问题 C:\Windows\System32\drivers\etc hosts: 127.0.0.1 ?? 二. 订阅方 订阅方设置结束 三. ...

  7. fdisk创立主分区过程

    [root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): p #显示当前硬盘的分区列表 Disk /dev/sdb: 21.5 ...

  8. NLP 文本预处理

    1.不同类别文本量统计,类别不平衡差异 2.文本长度统计 3.文本处理,比如文本语料中简体与繁体共存,这会加大模型的学习难度.因此,他们对数据进行繁体转简体的处理. 同时,过滤掉了对分类没有任何作用的 ...

  9. Linux虚拟化与容器化

    随着云计算的不断发展,计算资源不断集中于大规模的服务器集群上.为了充分发挥硬件潜力,提高服务器性能,虚拟化技术由此诞生. 所谓虚拟化技术,是指将计算元件和硬件隔离开来,隐藏底层的硬件物理特性,为用户提 ...

  10. pytorch中的学习率调整函数

    参考:https://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate torch.optim.lr_scheduler提供 ...