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. React重置非受控组件state的方法

    如果想通过props来重置state的值.有3种方法: 1. 最好的方法:key属性 修改key属性的值,可以使组件卸载后重新加载.所有的状态全部重置. 这种情况可以给key设一个每次渲染都会改变的值 ...

  2. CF1051D Bicolorings 递推

    考试T2,随便推一推就好了~ code: #include <bits/stdc++.h> #define N 1015 #define mod 998244353 #define ll ...

  3. [Luogu] 外星密码

    https://www.luogu.org/problemnew/show/P1928 沙比提 读清题目 #include <bits/stdc++.h> using namespace ...

  4. webpack4温习总结

    webpack是一个模块打包器,可以根据入口文件,随着依赖关系将所有文件打包成js文件. 首先需要node环境,百度一下自己安装 webpack官网地址:https://www.webpackjs.c ...

  5. Excel表格内容导出到页面

    引入org.apache.poi.ss.usermodel   public void addExcelBooks() throws Exception { HttpServletRequest re ...

  6. 【原】Python基础-函数

    #不定长参数,这里prams是一个元组集合def print_params(*prams): for e in prams: print(e) print(prams) #输出('xxx', (1, ...

  7. Lucene4.2源码解析之fdt和fdx文件的读写(续)——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压

    2       索引读取阶段 当希望通过一个DocId得到Doc的全部内容,那么就需要对fdx/fdt文件进行读操作了.具体的代码在CompressingStoredFieldsReader类里面.与 ...

  8. 备份的数据库文件(500M左右)无法导入的解决方法

    解决方法: 修改配置文件/usr/local/mysql/my.cnf 在my.cnf文件下添加一句:max_allowed_packet=900M 注:此处大小不能设置过大,过大可能会导致还原过程中 ...

  9. fdisk创立主分区过程

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

  10. qt 加载翻译文件 qm

    QTranslator* myTranslator=new QTranslator; myTranslator->load("xxx.qm"); app.installTra ...