Castle框架中的IOC和AOP机制

时间:2022-09-01 23:14:33

反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在。NET平台下实现这两项技术没有形成可以广泛套用的框架,使得开发人员在。NET平台下应用IOC和AOP技术的难度和成本大幅度提高。Castle提供了。NET平台下开发IOC和AOP技术的框架,一定程度上解决了开发人员的难题,但是如何高效地实现IOC和AOP技术的开发,至今无人提出较好的建议。

DOTNET就是。NET, 严格说是:.Net Framework框架 .但为什么叫DOTNET(。NET)呢?在计算机行业DOT是Distributed Object Technology的简称,意为分布式对象技术。DOT恰好与"点"的英语单词相同,DOT的音标[d?t]NET是一个微软开发的编程环境,里面可以使用C#,VB等多种编程语言。借助于 .NET 平台,可以创建和使用基于 XML 的应用程序、进程和 Web 站点以及服务,它们之间可以按设计、在任何平台或智能设备上共享和组合信息与功能,以向单位和个人提供定制好的解决方案。

本文主要研究Castle框架中的IOC和AOP机制,目标是设计出一个可视化工具,实现IOC和AOP机制中配置文件的可视化配置。该工具经过修改和完善也适用于其他框架中的IOC和AOP配置文件的生成。

1 Castle框架和相关技术介绍

1.1  Castle框架介绍

Castle是针对。NET平台下的一个非常优秀的开源项目,从数据访问框架 ORM到依赖注入容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务。

1.2  IOC技术介绍

IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。IoC设计模式重点关注组件的依赖性、配置以及生命周期。当然IoC也适用于简单类,而不只是组件。除了具有"Dependency Injection"(依赖注入)的昵称外,IoC还有另一个称呼,即Hollywood原则("Don't call me,I'll call you,请不要调用我,我将调用你),Ioc设计模式实现了"面向接口编程,而不是实现"的原则。

1.3  AOP技术介绍

AOP为Aspect Oriented Programming的缩写,意为:面向方法编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的--完成业务逻辑--仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

2 可视化IOC和AOP配置工具设计思路

可视化IOC和AOP配置工具是一个在。NET平台下开发的WinForm程序,这个工具的主要作用就是在IOC组件或者AOP组件都开发好的条件下,利用这个工具生成IOC或者AOP的配置文件,方法是读取现存的IOC组件或者AOP组件。在工具中进行相应的配置,最后直接生成开发人员所需的配置文件。

该工具的主要功能是通过读入现存的IOC组件或AOP组件,提取并暂存组件中与配置有关的重要信息,以可视化的方式显示在工具界面中,然后由开发人员操作该工具完成组件对应的配置文件的生成。这个过程可以划分为5个阶段(如图1):读取类文件>分析类文件>显示配置信息>开发人员对参数进行配置>生成配置文件。其中前三层是该工具主要实现的功能。因此,该可视化工具的代码部分分为3个层次来编写。分别是:读类文件、分析提取信息、显示信息。

Castle框架中的IOC和AOP机制

第一层主要是完成类文件的读取,在。NET平台下使用到了System.IO命名空间中文件操作相关的File类和StreamReader类,最终将整个读取的文件内容以string类型返回,以供第二层分析文件使用。

第二层的功能是在第一层的读取文件内容的基础上分析并提取关键字,即取出配置文件需要的重要信息,例如IOC反转控制模式主要有设值注入和构造方法注入,设值注入就是对类中的属性进行注入,而构造方法注入是对构造函数中的参数值进行注入。因此类中的属性和构造函数的参数就属于IOC配置文件的重要信息,第二层主要完成对类似的重要信息的识别和分类。在第二层中,完成的识别功能主要有:

(1) 识别类文件的命名空间、类名、接口名

命名空间、类名、接口名都是组成IOC和AOP配置文件的必备元素。

在IOC配置文件中,命名空间、类名、接口名常出现在component标签的service和type属性值中,而在AOP的配置文件中命名空间出现在Imports关键字之后。所以对命名空间、类名、接口名的提取是生成配置文件的必要条件。

(2) 识别类文件中的属性

IOC反转控制模式中的设值注入就是对类中的属性进行注入,如采用该注入模式设计系统,在IOC配置文件中,需要把类中的属性作为配置文件的标签。

(3) 识别类的构造方法中的参数名

IOC反转控制模式中的构造注入是对构造函数中的参数值进行注入,如果采用该模式设计系统,在IOC的配置文件中,需要把构造方法的参数名作为配置文件中的标签。

以上介绍的是第二层所识别的关键字的类别。在程序中关键字的获取主要是通过编写获取方法来实现。获取命名空间使用GetNamespace方法;获取类名使用GetClass方法;获取接口名使用GetInterface方法;获取属性名使用GetProperty方法。实现的思路是在遵循一定规约的前提下通过属性在类中的位置特征将其提取出来并且依次保存到一个ArrayList对象中。

为了保证该可视化工具识别关键字的准确性,程序员在编写IOC组件时要遵循以下规约:

(1) 要求IOC组件类的修饰符为"Public"

(2) 要求类中的全局变量都声明为"Private"

(3) 要求属性的修饰符为"Public"

(4) 要求构造方法的修饰符为"Public"

第三层是页面层。主要负责页面可视化设计。页面层用到了TreeView、Datagrid、TabControl、ContextMenuStrip等控件。TreeView控件以树形结构展示了当前读入的组件;Datagrid控件用来展示选中组件的构造方法参数或属性,并可以设置其参数值或属性值;ContextMenuStrip控件用于控制添加和删除组件操作;TabControl控件则是其他控件的容器。

以下,对该层使用到的主要控件及其触发事件按照其重要程度依次做介绍:

(1) TreeView控件

该控件的内容占第三层代码的三分之一,主要涉及到的触发事件有NodeMouseClick(单击)、NodeMouseDoubleClick(双击)、AfterCheck(复选框被选中)。设计的功能主要有:单击TreeView控件结点可查看该结点所代表组件的命名空间和类名;双击组件可以显示出该组件的构造方法参数或属性信息;选中复选框后可以将该组件标签添加到IOC配置文件中。

(2) TabControl控件

该控件主要用于分栏。在该系统中一共用到了2个TabControl控件,第一个用于左栏即控制栏,该栏一共包含了2个TabPage.这两个TabPage分别作为IOC组件的控制栏和AOP组件的控制栏。第二个TabControl控件作为显示栏,共包含了3个TabPage:第一个用来显示IOC的配置信息;第二个用来显示AOP的配置信息;第三个用来实时地显示当前正在配置的XML文件。

(3) Datagrid控件

Datagrid主要用于分行显示读入的构造方法的参数名或者类的属性名。

(4) ContextMenuStrip控件

该控件作为快捷菜单出现在单击TreeView控件某个结点后,它通常包含2个选项:"添加组件"和"删除所有组件".主要使用到的触发事件就是该控件的单击事件。

(5) OpenFileDialog控件

打开文件对话框控件,在本系统中,用于读入要配置的组件文件。

(6) SaveFileDialog控件

保存文件对话框控件,在本系统中,用于保存配置好的XML文件到指定的位置。

(7) WebBrowser控件

Web浏览器控件,在本系统中,主要用来实时的显示当前正在配置的XML文件。

除了上述设计内容外,还添加了两个类文件作为页面层的辅助类。主要负责一些常用的初始化代码及其辅助性方法代码,比如配置文件的初始化方法、DataTable的初始化方法、还有DataTable与Arraylist转换函数等。

以上主要介绍了可视化配置工具代码的三层结构。这三层结构是紧密联系的,层与层之间的代码是调用与被调用的关系。它们共同完成了可视化工具所需的功能。完成的主要功能有:

(1) 支持IOC中的构造方法注入和设值注入两种注入方式。

(2) 可以对IOC的构造方法参数值或者属性值进行设置或者修改;支持数组类型的构造参数。

(3) 可以设置或修改组件ID.

(4) 可以保存上次关闭时的组件及其状态信息。

(5) 支持AOP组件配置:可以在参数设置栏设置拦截器键值、自动识别切面的类型等。

(6) 可以同时配置AOP和IOC组件。

3 可视化配置工具的实现和应用

通过三层结构,可视化工具就实现了预计的功能:在IOC和AOP组件存在的前提下,使用该工具可以帮助开发人员完成配置文件的生成。

3.1 IOC可视化配置工具的实现

可视化工具的IOC部分的操作方法和操作步骤如下:

(1)在左栏Component节点上单击鼠标右键,选择添加组件,如图2,即可把组件信息载入进来;如果选择"删除所有组件",就可以把树型结构中的所有加载的组件删除,并把IOC配置文件中的该组件标签的全部信息相应删除。

Castle框架中的IOC和AOP机制

(2)添加完组件后单击该组件可以查看该组件的命名空间和类名;双击组件可以在IOC配置栏中显示出该组件的构造方法参数或属性信息。该工具支持两种IOC配置模式,即设值注入(属性注入)和构造方法注入。在遵循一定规则的前提下可以自动区分属性注入或构造方法注入。图3、图4展示的是一个设值注入(属性注入)的实例。

Castle框架中的IOC和AOP机制

3.2 AOP可视化配置工具的实现

与IOC不同,AOP的配置也需要读入相应的类文件,根据AOP的配置特点,要分别读入拦截器 (Interceptor)、混淆器(Mixin)和切面(Aspect对象),其中Mixin是可选项。

AOP配置界面中"参数配置"栏可以对Interceptor、Mixin设置别名,这就如同HashTable中键和值的一一对应关系,在使用到某个Interceptor或Mixin时可以用它的别名代替。

"Aspect配置"栏显示了当前读入的拦截器 (Interceptor)、混淆器(Mixin)和切面信息。根据Castle中AOP的配置原则进行相应配置后点击"添加该方面"按钮就可以生成对应的AOP配置文件,同样可以查看配置结果。

图5、图6展示了AOP配置的过程。

Castle框架中的IOC和AOP机制

4 可视化工具的插件版本

可视化配置工具的插件版本是把先前在。NET平台下做好的Winform程序做成Sharpdevelop的插件。这是为了满足更多开发者的需要,Sharpdevelop的灵活和轻巧博得了很多开发人员的喜爱。

可视化工具插件版本主要由两个文件构成,一个是Dll文件,负责整个插件的功能逻辑,这部分代码与。NET下编写好的代码基本一致;另一个是Addin文件,负责该插件在Sharpdevelop开发工具中出现的位置和名称等。该插件位置设置为工具菜单下的最后一个选项。名为"组件装配".

图7展示了在SharpDevelop平台下打开"组件装配"插件后的效果。

Castle框架中的IOC和AOP机制

相关文章