博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AOP学习-基于Emit和Attribute的简单AOP实现
阅读量:6706 次
发布时间:2019-06-25

本文共 2178 字,大约阅读时间需要 7 分钟。

关于AOP的介绍,园子里曾经有段时间非常热。

我也看了很多AOP相关的文章,对AOP的概念有一定的了解,觉得园子里的大牛张逸的AOP介绍很不错:

看了很多AOP的介绍之后,很想自己实现一个简单的AOP来感受一下,但是一直苦于不知道怎么实现。

后来看了园子里的一个介绍Emit的系列(),才开始在原作者的基础上实现了简单的AOP框架,仅供学习使用。

1. ThinAOP的介绍

此框架非常简单,只有几个文件。但是就是因为简单,所以可以用来学习AOP的思想。

由于主要部分是有Emit实现的,所以没有Emit基础的话,最好先看一下

具体结构如下:

2. ThinAOP的介绍-ProxyFactory

之所以先介绍ProxyFactory,是因为ProxyFactory是ThinAOP对外的接口,对于需要使用AOP的类,需要使用ProxyFactory来生成相应的代理类。

ProxyFactory类中只有一个静态方法,就是用来生成动态代理类的。

1
2
3
4
5
6
7
8
9
10
public 
class 
ProxyFactory
{
    
public 
static 
T CreateProxy<T>(Type realProxyType)
    
{
        
var 
generator =
new 
DynamicProxyGenerator(realProxyType,
typeof
(T));
        
Type type = generator.GenerateType();
 
        
return 
(T)Activator.CreateInstance(type);
    
}
}

3. ThinAOP的介绍-Metadata

Metadata中定义了四个类:

  • ExceptionMetadata:用于保存程序中exception的信息
  • MethodMetadata   :用于保存程序中方法的信息(目前只有方法名)
  • ParameterMetadata:用于保存程序中方法的参数信息
  • ResultMetadata:用于保存程序中方法的返回值信息

通过上面定义的四个类,我们可以看出此AOP框架值主要是针对方法这个级别的拦截。即拦截方法在执行前,执行后,异常时的操作。

这四个类非常简单,只是定义了一些属性。

4. ThinAOP的介绍-InvokeContext

保存了必须的上下文信息,也就是上面定义的那些Metadata

5. ThinAOP的介绍-DynamicProxyGenerator

这个类是整个框架的核心,用来生成动态代理,在代理中完成对方法的拦截操作,并在拦截后注入自己的代码。

核心方法是GenerateType,根据现有type生成新的type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public 
Type GenerateType()
{
    
// 构造程序集
    
BuildAssembly();
    
// 构造模块
    
BuildModule();
    
// 构造类型
    
BuildType();
    
// 构造字段
    
BuildField();
    
// 构造函数
    
BuildConstructor();
    
// 构造方法
    
BuildMethods();
 
    
Type type = _typeBuilder.CreateType();
    
// 将新建的类型保存在硬盘上(如果每次都动态生成,此步骤可省略)
    
_assemblyBuilder.Save(AssemblyFileName);
    
return 
type;
}

其中的Emit代码,我已经写了相应的C#代码。

Emit代码类似IL,我也是先写C#代码,然后用ILSpy转成IL代码,然后参照IL代码来写的Emit部分代码。

6. ThinAOP的介绍-AspectAttribute

这个类定义了一系列的Attribute,方便于定义拦截操作。

主要定义了3中拦截操作:分别是执行前拦截 ,执行后拦截,异常时拦截

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[AttributeUsage(AttributeTargets.Method)]
public 
abstract 
class 
PreAspectAttribute : AspectAttribute
{
}
 
[AttributeUsage(AttributeTargets.Method)]
public 
abstract 
class 
PostAspectAttribute : AspectAttribute
{
}
 
[AttributeUsage(AttributeTargets.Method)]
public 
abstract 
class 
ExceptionAspectAttribute : AspectAttribute
{
}

PS.

整个框架的实现参考了博客园里很多文章,这里就不一一列举了。

除了ThinAOP的框架外,我还写了了一个使用这个框架的例子,具体请参见提供的附件:

本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2011/08/10/2133405.html,如需转载请自行联系原作者

你可能感兴趣的文章
js进阶 12-14 jquery的事件触发函数是哪两个
查看>>
艾伟也谈项目管理,产品版本改造中的项目管理
查看>>
HP官方提供的LR在线基础视频教程
查看>>
yii 隐藏index.php
查看>>
OEA框架学习:使用动软代码生成器
查看>>
【编程范式】汇编解释swap方法
查看>>
[置顶] LLVM每日谈之十五 LLVM自带的examples
查看>>
2013下半年-学习目录
查看>>
网速4M等于多少KB/S,等于多少kbps
查看>>
MySQL MERGE存储引擎 简介
查看>>
asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
查看>>
用vs2013开发node.js的addon.
查看>>
atitit。自己定义uml MOF EMF体系eclipse emf 教程o7t
查看>>
atitit.taskService 任务管理器的设计 v1
查看>>
编写jquery插件的分享
查看>>
机器学习 —— 概率图模型(学习:对数线性模型)
查看>>
2016百度编程题:蘑菇阵
查看>>
解决教学问题新感悟
查看>>
nyoj 37 回文字符串
查看>>
Lintcode--006(交叉字符串)
查看>>