首页 / 软件开发 / .NET编程技术 / Emit学习-实战篇-实现一个简单的AOP框架(三)
Emit学习-实战篇-实现一个简单的AOP框架(三)2011-01-06 博客园 yingql今天来介绍配置文件的定义和加载,先给出配置文件的内容,然后在详细介绍里面各节的含义,以及如何用程序加载配置文件,内容如下:配置文件<?xml version="1.0" encoding="utf-8" ?>
<AOP>
<Regeisty>
<IPreProcess>
<Aspect id="AddPreProcessLog" value="YQL.TestProject:YQL.TestProject.AddPreProcessLog" isDefault="true"/>
<Aspect id="VerifyPermission" value="YQL.AOP:YQL.AOP.VerifyPermission"/>
</IPreProcess>
<IPostProcess>
<Aspect id="AddPostProcessLog" value="YQL.TestProject:YQL.TestProject.AddPostProcessLog" isDefault="true"/>
</IPostProcess>
<IExceptionHandler>
<Aspect id="SimplyExceptionHandler" value="YQL.TestProject:YQL.TestProject.SimplyExceptionHandler" isDefault="true"/>
</IExceptionHandler>
</Regeisty>
<Application>
<Class id="YQL.TestProject:YQL.TestProject.Test">
<Method id="Int32 Test4(System.String)">
<IPreProcess>
<Aspect id="AddPreProcessLog"/>
</IPreProcess>
<IPostProcess>
<Aspect id="AddPostProcessLog"/>
<Aspect id="TestException"/>
</IPostProcess>
<IExceptionHandler>
<Aspect id="SimplyExceptionHandler"/>
</IExceptionHandler>
</Method>
</Class>
</Application>
</AOP>
配置文件中包含两个部分分别是Regeisty节和Application节,Regeisty节包含了所有切面的实现类的定义,包含id,value和isDefault三个属性:id表示这个实现的代号,在Application节可以通过这个代号来引用某个实现类,作为主键标识,必须唯一;value是这个实现类的具体信息,由所在的程序集和类的全名组成,中间用冒号分隔;isDefault属性为可选,如果设置为true,则表示某个方法在没有特殊的定义的情况下,使用这个实现类来实现某个具体的切面处理。Application节包含了所有需要特殊处理的方法的信息,首先是这个方法的所在类(类的信息描述与前面相同),然后是方法名,包括返回值类型和参数类型。按照我的设想,这个配置文件应该是通过一个配置工具,通过反射和用户的一些选择操作来生成的,当然现在这个配置工具还不存在,留待以后扩展。接下来是配置文件的加载,我们定义了一个AopConfigManager类用来实现配置文件的加载以及维护,这里面包含了两个对外的方法分别用来初始化配置文件,和为方法植入时提供需要植入的切面信息,这两个方法的实现如下:Init/// <summary>
/// 初始化配置文件信息
/// </summary>
/// <param name="configFilePath">配置文件路径</param>
public static void Init(string configFilePath)
{
XPathDocument document = new XPathDocument(configFilePath);
XPathNavigator rootNavigator = document.CreateNavigator();
//初始化各个方面的配置信息
InitAspectInfo(rootNavigator);
//初始化非默认行为的方法的方面配置信息
InitClassInfo(rootNavigator);
}