面向方面编程_第1页
面向方面编程_第2页
面向方面编程_第3页
面向方面编程_第4页
面向方面编程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编程语言面向方面编程01简介比较小结利弊软件特点目录03050204基本信息面向方面的编程(AOP)由来已久,但是直到最近才开始获得Microsoft.NET开发社区的青睐。任何一项新技术的采纳往往都会产生对该技术及其使用的误解,AOP也不例外。为了澄清对AOP的误解,本文以及下列代码示例将举例说明一个AOP的实际应用程序和一些AOP能够解决的常见问题。以使用Web服务的应用程序为例,我们将扩展该Web服务返回的对象功能,方法是通过一个AOP框架对返回的对象应用新的方面。这些方面将为此功能独立生成对象模型,从而脱离WSDL。简介简介在考虑对象及对象与其他对象的关系时,我们通常会想到继承这个术语。例如,定义某一个抽象类—Dog类。在标识相似的一些类但每个类又有各自的独特行为时,通常使用继承来扩展功能。举例来说,如果标识了Poodle,则可以说一个Poodle是一个Dog,即Poodle继承了Dog。到此为止都似乎不错,但是如果定义另一个以后标识为ObedientDog的独特行为又会怎样呢?当然,不是所有的Dogs都很驯服,所以Dog类不能包含obedience行为。此外,如果要创建从Dog继承的ObedientDog类,那么Poodle放在这个层次结构中的哪个位置合适呢?Poodle是一个Dog,但是Poodle不一定obedient;那么Poodle是继承于Dog还是ObedientDog呢?都不是,我们可以将驯服看作一个方面,将其应用到任何一类驯服的Dog,我们反对以不恰当的方式强制将该行为放在Dog层次结构中。在软件术语中,面向方面的编程能够独立于任何继承层次结构而应用改变类或对象行为的方面。然后,在运行时或编译时应用这些方面。举一个关于AOP的示例,然后进行描述,说明起来比较容易。首先,定义四个关键的AOP术语,这很重要,因为我将反复使用它们:接合点(Joinpoint)—代码中定义明确的可识别的点。切点(Pointcut)—通过配置或编码指定接合点的一种方法。利弊利弊一种常见的误解是认为AOP是截获,事实并非如此。但是,它确实运用了截获来应用通知以及组合行为。有一些.NET代码示例通过ContextBoundObject以一种AOP翻版风格说明截获。可是用ContextBoundObject来说明截获并不合适,因为使用这种方法的先决条件是所有需要进行截获的类都必须从ContextBoundObject继承。像ContextBoundObject这样带有先决条件的AOP方法会带来需求产生的负面影响,所以在AOP中被视为重方法,应该避免使用。重方法在系统中遗留的大量“足迹”会潜在地影响每个类,阻碍将来更改或修改系统的功能。我创建了一个名为Encase的轻量型框架。用“轻量型”这个术语的意义是整体上对系统没有影响。系统的不同部分仍然受AOP影响,但是选择轻量型框架并应用良好的编程实践可以减轻大部分负面问题。Encase框架的用途是简化切点、混入和方面组合。开发人员能够通过代码在Encase中应用方面,从而代替大多数其他轻量型AOP框架使用的配置文件(例如XML)。重量型框架阻碍了AOP的应用,但是妨碍AOP广泛应用的罪魁祸首是目前可用的AOP示例几乎都都包含以下内容:执行方法前先截获,并应用执行Trace.WriteLine("Methodentered.")的方面。与普遍看法相反,除了日志记录、安全、规范以及这类性质的事情外,AOP对于解决其他问题也很有用。比较比较为了说明更实用的使用AOP的方法,我们将创建一个应用程序,从名为ContactService.Service的Web服务接收people对象的集合。在.NET开发中使用Web服务的最常见方法是调用返回XML的Web服务,该服务通过框架自动反序列化为一个对象。这些对象仅包含数据而不包含任何行为。在.NETFramework2.0中,通过使用partial关键字并创建行为,能够对这些自动代码生成的对象添加功能。但是在一些Web服务或代理对象之间重用某个特定行为时仍然存在一个问题。如前所述,多数情况下,共享的公共行为将包含在一个抽象类中,其他所有类从该类继承。但是,我们不能使Web服务对象继承功能。借此良机,通过这个问题说明AOP功能如何强大。我们的应用程序用于显示人信息。最初它的用途是显示信息,但是需要添加某些行为。为了查看代码示例,我们需要创建一个称为TheAgileDeveloper.ContactService的虚拟目录。该目录必须指向TheAgileDeveloper.ContactService项目在本地计算机上的位置。注通过localhost/TheAgileDeveloper.ContactService可以访问此项目,这一点很重要。图1.应用程序屏幕快照。应用程序有一个视图,它是一个名为MainForm的WinForm,用于显示左侧ListView中Web服务返回的人对象。选定一个人时,名字、姓氏和Web页将显示在右侧的文本框中。载入MainForm时,它调用ServiceManager类来获取人信息。软件特点软件特点每个框架应用切点、通知或方面的方法都是独特的,但是其目的和概念是相同的。在本文示例中,Encaser包装一个对象时真正进行的操作是,通过命名空间中的类产生MSIL代码,从而随时创建新的Contact类型。新Contact类型派生于Contact类,它仍然共享类型,但是新包装的对象还持有对ContactSave对象的引用,后者是我们混入的。ISavable.Save方法在新的Contact对象上实现,因此在调用Save时,它实际上将调用委托给混入的ContactSave对象。这样做的优点是能够将新的Contact对象转换为在任何混入对象上实现的任何接口。图2.包装对象的UML图表图2.包装对象的UML图表。您或许在想,通过.NETFramework2.0的部分类语言功能,可以在另一个partial类中添加Save行为。这是可能实现的,但是本文没有采用这种方法,这是为了使代码与.NETFramework1.x的其他版本向后兼容。既然有部分语言功能,那么在正常情况下,前面的示例也就不需要使用混入了。但是混入仍然很有价值,因为通过它,开发人员可以混入可重用的对象行为,这些对象可以源自其他不相关的对象层次结构,它实现的功能比partial类更多。在使用partial关键字时,是在同一个类或类型中添加代码,只不过物理位置不同。下一个混入示例说明的添加行为不只特定于Contact类,而是一个名为FieldUndoer的可重用类。FieldUndoer实现了IUndoable接口,允许

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论