ICANN认证国际域名顶级注册机构
网站建设,域名注册,空间租用,软件销售,广告设计 域名注册,空间租用, 网站建设,东莞网页设计,域名注册,网站推广,网站开发,网页设计 网站推广,,百度推广,新浪推广,雅虎推广,网易推广 标志设计,画册设计,包装设计,VI策划,企业形象顾问 连邦软件加盟店,提供销遥行,管家婆,速达,用友ERP,诺顿等软件报价及销售 建站必读 腾达网络,上网帮助中心, 腾达为东莞等地,提供网站建设,网站推广,广告设计,软件销售等优质服务!
建站必读


 
 
当前位置:首页 -> 建站必读 -> .NET技术
基于.Net的AOP实现技术
基于.Net的AOP实现技术



前言



在笔者的《面向对象的应用服务层设计》一文中,笔者讨论了软件系统中设计应用服务层所需要考虑的问题,以及系统分层的基本思考方法。这些讨论作关注的问题,都是系统中纵向的层次的划分。然而,在设计软件系统的时候,我们不仅仅要考虑纵向的关系,很多时候,我们还需要关注所谓的“横切关注点”的问题,例如,存在于系统每个部分的日志记录、安全性验证等。AOP(面向方面编程)的出现,便是为了解决这些“横切关注点”的问题。



虽然AOP目前还不是如OOP般非常成熟,但是,也已经有数个支持AOP的产品问世,其中比较有名的有AspectJ,AspectWerkz等,这些产品都基于Java平台。在.Net平台上,也有一些实现,如LOOM等,但是,相对于Java平台的实现,这些实现都还很不成熟,功能也比较弱,使用上也不是很方便。因此,笔者在.Net平台下自己实现了一个轻量级的AOP框架,现在拿出来同大家共同探讨。



在本文中,笔者将首先归纳一下目前实现AOP的基本手段,然后,给出一个已经实现的AOP的范例(WebsharpAspect),并提供全部源代码,这是一个轻量级的AOP实现,虽然目前功能还不是很强大,实现也比较简单,但是,他已经可以完成大部分我们所需要的AOP功能,你可以在项目中直接使用他。重要的是,其中展示了在.Net环境下实现AOP的一些技术和思路,笔者也希望通过提供源代码的方式,能够对大家学习AOP有所助益。



实现AOP的方法



实现AOP的关键,是拦截正常的方法调用,将我们需要额外附加的功能透明的“织入”到这些方法中,以完成一些额外的要求。从总体方法上来说,织入的方法有两大类:静态织入和动态织入。



静态织入方法,一般都是需要扩展编译器的功能,将需要织入的代码,通过修改字节码(Java)或者IL代码(.Net)的方法,直接添加到相应的被织入点;或者,我们需要为原来语言添加新的语法结构,从语法上支持AOP。AspectJ就是采用的这种方式。使用这种方式来实现AOP,其优点是代码执行的效率高,缺点是实现者需要对虚拟机有很深的了解,才能够做到对字节码修改。由于织入方法是静态的,当需要添加新的织入方法时,往往需要重新编译,或者说运行字节码增强器重新执行静态织入的方法。当然,在.Net平台上,我们也可以使用Emit提供的强大功能来实现这一点。另外,字节码增强器带来了很大的不透明性,程序员很难直观的调试增强后的字节码,因此很多程序员总是在心理上抵制这种字节码增强器。



动态织入的方法,具体实现方式就有很多选择了。在Java平台上,可以使用Proxy模式,或者定制ClassLoader来实现AOP功能。在.Net平台上,要实现AOP的动态织入,归纳起来,可以采用以下几种方法:



l 使用ContextAttribute和ContextBoundObject来对对象的方法进行拦截。关于ContextAttribute的具体使用方法,读者可以参考MSDN等相关资料。



l 使用Emit来,在运行时刻动态构建被织入代码后的类,当程序调用被织入类时,实际上调用的是被修改后的类。LOOM使用的就是这种方式,但是,个人认为,LOOM目前的实现非常生硬,其可扩展性和灵活性都不是很好。



l 使用Proxy模式。这也是本文将详细介绍的方法。



l 当然,在ASP.Net项目中,我们还有一种选择,就是使用HTTPHandler和HTTPModule来对自定义对ASP.Net页面的访问,加入一些我们需要的处理。关于如何使用HTTPHandler和HTTPModule的内容,可以参考笔者的文章《ASP.Net中自定义Http处理及应用之HttpHandler篇》,以及《ASP.Net中自定义Http处理及应用之HttpModule篇》



下面,我们来探讨如何使用Proxy模式,在.Net平台上实现一个可用的AOP框架。



第一个例子



首先,我们来看看WebsharpAspect的使用效果。我们可以使用以下步骤来完成我们的第一个例子的编写:



1、 在VisualStudio中新建一个控制台应用程序,把Websharp.Aspect.dll添加入引用。



2、 添加一个类,命名为FirstAspect,并使他实现IAspect接口,添加代码如下:



public class FirstAspect : IAspect



{



public void Execute(object[] paramList)



{



Console.WriteLine("FirstAspect is called");



}



}





3、 添加一个BusinessClass类,模拟具体的业务逻辑类,使这个类继承AspectObject类,并添加AspectManaged特性,然后添加两个方法,代码如下:



[AspectManaged(true)]



public class BusinessClass : AspectObject



{



public BusinessClass(){}



public void OutputMethod()



{



Console.WriteLine("OutputMethod()");



}



public void GetString()



{



 
 
本站关键词:
|网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间||网站开发|东莞域名空间|东莞广告公司|东莞广告设计|网站建设东莞|东莞网站制作|东莞网站推广|东莞国内域名注册|做网站|设计网站|东莞虚拟主机|东莞asp空间|
域名注册 | 虚拟主机 | 网站建设 | 网站推广 | 广告设计 | 帮助中心 | 软件中心 | 关于腾达
东莞市腾达信息工程有限公司      本站网络实名: 东莞网站建设
地址:东莞市新城市中心区第一国际B座610   邮编:523007
电话:0769-22026071 22026072 传真:0769-22026076 24小时服务热线:13712032014
© 2002~2005 腾达网络   版权所有