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组件属性/方法/库属性

    1. propTypes 用于进行props的类型检查:来自于prop-types库. // V15.5之后 import PropTypes from 'prop-types'; 该方法适用于函数组 ...

  2. 接口实现后台GZIP压缩,pako.js 前端解压

    import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException; ...

  3. mysql 的编写顺序和执行顺序

    编写顺序 S..F..W..G..H..O 执行顺序 F..W..G..H..S..O from →join →on →where →group by→having→select→order by→l ...

  4. 2G以上的大文件如何上传

    无法上传大文件是因为php.ini配置有限制了,这样限制了用户默认最大为2MB了,超过了就不能上传了,如果你确实要上传我们可以按下面方法来处理一下. 打开php.ini, 参数  设置  说明 fil ...

  5. PHP安装与配置

    一.官网下载 进入PHP下载地址http://windows.php.net/download下载最新线程安全版(Thread Safe)PHP zip压缩包,解压缩后放在想要安装的路径下.我这里下载 ...

  6. link cut tree 洞穴勘测

    /*[bzoj2049][Sdoi2008]Cave 洞穴勘测 2014年7月30日1,06923Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区 . ...

  7. Java基础系列 - HashMap

    package com.test3; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...

  8. C++删除字符串的前后空格

    函数: string trim(string& str) { str.erase(0, str.find_first_not_of(" \t")); // 去掉头部空格 s ...

  9. 编程微语 2019-Summer

    不支持重新生成不是好的代码生成器.重新生成就会覆盖手工修改,实用性大打折扣.相比工具,更接近玩具.2019-05-04 有很多个标准,各自为政,就相当于没有标准.目前地球的文档(如纯文本/Word/P ...

  10. SpringBoot面试题 转(已迁移到java相关知识点)

    ## 什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的 ...