Castle框架中的IOC和AOP机制
反转控制(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个层次来编写。分别是:读类文件、分析提取信息、显示信息。
第一层主要是完成类文件的读取,在。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配置文件中的该组件标签的全部信息相应删除。
(2)添加完组件后单击该组件可以查看该组件的命名空间和类名;双击组件可以在IOC配置栏中显示出该组件的构造方法参数或属性信息。该工具支持两种IOC配置模式,即设值注入(属性注入)和构造方法注入。在遵循一定规则的前提下可以自动区分属性注入或构造方法注入。图3、图4展示的是一个设值注入(属性注入)的实例。
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配置的过程。
4 可视化工具的插件版本
可视化配置工具的插件版本是把先前在。NET平台下做好的Winform程序做成Sharpdevelop的插件。这是为了满足更多开发者的需要,Sharpdevelop的灵活和轻巧博得了很多开发人员的喜爱。
可视化工具插件版本主要由两个文件构成,一个是Dll文件,负责整个插件的功能逻辑,这部分代码与。NET下编写好的代码基本一致;另一个是Addin文件,负责该插件在Sharpdevelop开发工具中出现的位置和名称等。该插件位置设置为工具菜单下的最后一个选项。名为"组件装配".
图7展示了在SharpDevelop平台下打开"组件装配"插件后的效果。
Castle框架中的IOC和AOP机制的更多相关文章
- 详谈 Spring 中的 IOC 和 AOP
这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...
- 理解Spring中的IOC和AOP
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...
- 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制
推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...
- 第四课:通过配置文件获取对象(Spring框架中的IOC和DI的底层就是基于这样的机制)
首先在D盘创建一个文件hero.txt,内容为:com.hero.Hero(此处必须是Hero的完整路径) 接下来是Hero类 package com.hero; public class Hero ...
- Spring中的IOC\DI\AOP等概念的简单学习
IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终, 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.Spr ...
- Spring框架中的IOC?
Spring中的org.springframework.beans包和org.SpringframeWork.context包构成了Spring框架IOC容器的基础.BeanFactory接口提供了一 ...
- Spring中的IOC和AOP是什么含义,他们在项目中起到什么作用,并举例说明?
IOC:控制反转,是一种设计模式.一层哈尼是控制权的转移:由传统的在程序中控制并依赖转移到容器赖控制:第二是依赖注入:将相互以来的对象分离,在Spring配置文件中描述他们的依赖关系.他们的依赖关系只 ...
- Spring中的IOC和AOP
一.IOC(DI) Inversion of Control 控制反转,也叫(Dependency Injection)依赖注入. 我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这 ...
- Spring框架中的IOC和DI的区别
上次面试被问到IOC和DI的区别时,没怎么在意,昨天又被问到,感觉有点可惜.今晚总算抽点时间,查看了spring官方文档.发现,IoC更像是一种思想,DI是一种行为.为了降低程序的耦合度,利用spri ...
随机推荐
- BZOJ2073: [POI2004]PRZ
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2073 题解:跟风Xs酱! 数据范围这么小,肯定是状压DP.咦?怎么枚举子集?... 跪烂Xs: ...
- ffmpeg开发指南
FFmpeg是一个集录制.转换.音/视频编码解码功能为一体的完整的开源解决方案.FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用.FFmpeg支持MPEG.DivX.M ...
- 数据库语言(二):SQL语法实例整理
连接表达式: select * from student join takes on student.ID = takes.ID; 通过on后面的谓词作为连接条件,相同的属性可以出现两次,也就是等价于 ...
- ORACLE 全局索引和本地索引
Oracle数据库中,有两种类型的分区索引,全局索引和本地索引,其中本地索引又可以分为本地前缀索引和本地非前缀索引.下面就分别看看每种类型的索引各自的特点. 全局索引以整个表的数据为对象建立索引,索引 ...
- 【大数处理、正则表达式】NYOJ-513
[正则] 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”). 模式描述在搜索文本时要匹配的一个或多个字符串. 常用字符: //正则表达式 //$ 匹配 ...
- UVALive 4255 Guess
这题竟然是图论···orz 题意:给出一个整数序列a1,a2,--,可以得到如下矩阵 1 2 3 4 1 - + 0 + 2 + + + 3 - - 4 + &quo ...
- hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online
这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ...
- java web 学习十五(jsp基础语法)
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- Redis,Memcache,mongoDB的区别
从以下几个维度,对redis.memcache.mongoDB 做了对比,欢迎拍砖 1.性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mo ...
- C++标准库开发心得
最近放弃MFC,改用C++标准库开发产品.毕竟MFC用熟了,马上改用STL还不太习惯.下面列出下总结的改用STL遇到的问题和解决办法: 1.清除空格 remove_if(iterBegin, iter ...