Net AOP.ppt_第1页
Net AOP.ppt_第2页
Net AOP.ppt_第3页
Net AOP.ppt_第4页
Net AOP.ppt_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、问世间AOP为何物?,.Net AOP,到底是什么破玩意? 网上文章满天飞,神马“横切关注点、连接点、切入点、通知”一大堆概念,搅和的我焦头烂额,坐立不安,神秘莫测的理论用词已经被渲染到极致。最终,我放弃了去了解这些已经早在JAVA世界就被炒烂了的破烂概念。 最后,我不得不静下心来,去找找AOP产生的原因。,故事的开始,我始终坚信,任何理论的产生都是源于实践结果,最终在时间上晚于实践结果。 看看我们业务场景吧。 我们的领域业务代码里是否还散落着重复性的首尾的事务处理代码、记日志代码、异常处理代码、参数检查代码.如果有,我们这些终日面向对象的人们,是否应该考虑下了? 如何才能把这些东西从我们的领

2、域业务代码里抽离出来呢? 如何才能满足在我们业务方法前后加入自定义的逻辑呢? 我所看到的和想到的很简单:就是构造一个目标业务对象的 代理,把自定义前后或者说拦截逻辑添加到这个代理中,最终代理 会转发调用我们的业务对象方法。,故事的开始,拦截图,我们的目标,实现代理 给代理添加拦截器的链条 在每个拦截器里添加有着特定嗜好的处理器(通知器)。,开始做代理之思路,如何实现一个代理呢? 编译器扩展 .net的代码运行时生成 自己动手生写,那个一样的行为 . 张三说JAVA就是好,JRE有个动态代理。岛耐特(.Net)不会这么笨吧,不会这么不体贴吧?一番谷歌,终于有所收获,好像跟.Net Remotin

3、g有关系啊。哎呀,事大了,跟Remoting扯上关系了。那就让我们看看Remoting到底有哪些实用部件为我等所用。,开始做代理之框架部件,咱也拷两个图 Client:,开始做代理之框架部件,Server:,开始做代理之框架部件,透明代理和真实代理 概述 CLR提供了运行时的动态代理也就是透明代理,它的作用就 是在运行时按照接口或类型的元数据信息生成一个透明代理 类,它的作用就是把栈调用转化为消息,然后透明代理类中 的每个方法中会调用某个类的Invoke方法,把转换后的消息 作为参数传递给这个方法,最后透明代理会从返回消息里取 出结果。 我们可以在Invoke这个方法里,检查方法参数的名称,分

4、别 调用目标类型对象或目标对象的方法。我们可以在这里自己 做手脚了。我们可以自己构造一个拦截器链条并最终转发调 用。后面有例子来说明这个。 “某个类”就是真实代理类,这个类实现了真正的对目标对象的 路由调用。,开始做代理之框架部件,代理API 透明代理和真实代理是一对一关系。一个透明代理一定 有一个真实代理与之相对应。我们从一个导航到另一个。 RealProxcy.GetTransparent(),可以返回一个要使用 真实代理的透明代理。 RemoteServices.GetProcx(obj-透明代理引用) 返回透明代理使用的真实代理。 RealProxcy是一个抽象类,重写invoke方法

5、可以实现 自己的拦截逻辑。注意参数是实现了Imessage接口的 消息对象。,开始做代理之框架部件,代理的原材料 真实代理构造函数 有个参数是类型对象(TYPE). 很显然,这个类型对象既可以来自接口,也可以来自具体类。 但是注意:类必须继承自MarshelByRefObject类。 据说这个类一个重要的作用就是告诉CLR,不要内联我的函数。 好像是“刀”先生说的。 实例:实现了两个不同原材料的代理 让我们一起看看代码吧。 继承自MarshelByRefObject的类型作为目标类型的好处, 我们可以利用RemotingServices.ExecuteMessage的栈生成器 接收器来实现 对

6、目标对象的调用,简化了我们的代码。,开始做代理之框架部件,例子1:以接口为原材料 public class ProxyFactory2 : RealProxy where I : class 构造函数: private ProxyFactory2(Type t) : base(typeof(I) targetImplType = t; 具体参见源代码,开始做代理之框架部件,例子2:以类型为原材料 public class ProxyFactory : RealProxy,IRemotingTypeInfo where I : class 构造函数: public ProxyFactory(Ty

7、pe t) : base(t) targetImplType = t; 具体参见源代码,开始做代理之框架部件,代理的实现方式 一种是前面实现的自定义显式代理。 一种是隐式透明代理。 隐式透明代理是CLR给我们提供的又一个超级礼物。 接下来重点介绍一下隐式透明代理实现方式。,开始做代理之框架部件,隐式透明代理的实现方式 要被拦截的目标对象必须继承自ContextObject CLR的对继承自ContextObject的类的处理过程 CLR 遇到new 指令的时候,会检查目标类是否继承 自ContextObject, 如果是,那么就会为这个目标对象创建 一个特定的上下文环境,并返回一个透明代理到客

8、户端。 对象上下文可以认为是CLR为我们准备好的一个可插入拦截器的 一 个基础设施。CLR在构造上下文对象的时候,会检查目标对象 的上下文特性(实现 了 IContextAttribute的特性),会调用上下文 特性类中的特定方法。在这些方法里可以添加用户自定义的拦截器。 我们为何不趁此机会加入一个拦截器链条呢?,实现拦截之实作部件,拦截器基类 public abstract class Interceptor Base : IMessageSink, IComparable 具体参见源代码 拦截器链构造器 public class InterceptorChainBuilder 具体参见源代码 嗜好处理器基类 public abstract class AdviseBase:Iadvise 具体参见源代码,实现拦截之实作部件,嗜好处理器提供者 public class AdviseProvider : IProvider 主要是提供与拦截器相关的嗜好处理器 具体参见源代码 自定义上下文特性 public class InterceptorAttribute :ContextAttr

温馨提示

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

评论

0/150

提交评论