C#使用KingAOP实现AOP面向切面编程一
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面向切面编程一的更多相关文章
- spring-第十六篇之AOP面向切面编程之Spring AOP
1.上一篇介绍了AspectJ在AOP的简单应用,让我们了解到它的作用就是:开发者无需修改源代码,但又可以为这些组件的方法添加新的功能. AOP的实现可分为两类(根据AOP修改源码的时机划分): 1& ...
- C#使用KingAOP实现AOP面向切面编程二
本文继续上篇讲述一下比较复杂点的AOP例子,先新建一个控制台项目,然后同样先在Nuget中搜索安装KingAop到项目中 1.项目结构 2 .定义一个登录实体类User和LoggingAspect切面 ...
- spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用
1.去官方网站下载aspectj-1.8.0.jar 2.在jar包目录启动cmd,执行java -jar aspectj-1.8.0.jar,Next 3.检查JAVA_HOME路径是否正确,如果不 ...
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
随机推荐
- 前端利用webuploader实现超大文件分片上传、断点续传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- learning scala How To Create Implicit Function
println("Step 1: How to create a wrapper String class which will extend the String type") ...
- 题解 CF1063B 【Labyrinth】
题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...
- Luogu4689 [Ynoi2016]这是我自己的发明 【莫队】
题目链接:洛谷 又来做Ynoi里面的水题了... 首先换根的话是一个套路,首先以1为根dfs,然后画一画就知道以rt为根,x的子树是什么了.可以拆分为2个dfs连续段. 然后如果要计算\([l_1,r ...
- 如何实现一个 windows 桌面动态壁纸
更新: 2018/08/31 WS_MOUSE_LL 钩子,实现底层壁纸交互效果. 一.介绍 国内玩家第一次看到动态壁纸,都是出于一款来自 Wallpaper Engine 的 Steam 程序. ...
- 数据结构实验之查找四:二分查找(SDUT 3376)
#include <stdio.h> #include <string.h> #include <stdlib.h> int a[1000005]; int fin ...
- a=”hello”和b=”世界”编码成bytes类型
a="hello" c=a.encode(encoding='utf-8') a = b'hello' b="世界" b = b.encode(encoding ...
- Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
答:赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个. 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改 ...
- Tkinter 之Menu菜单标签
一.参数说明 语法 作用 MenuBar = tk.Menu(window) 创建一个菜单栏 fileBar = tk.Menu(MenuBar, tearoff=0) 创建一个菜单项,不分窗. Me ...
- 怎么在for循环中新建出不同的list
public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 1, 1, 1, 1, 3, ...