- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
万能对象与调用截获
再谈透明代理前面有一篇博客谈到了如何实现AOP,也就是如何拦截所有方法调用的技术。只是很浅显的讲到了如何去做才能实现方法拦截,对其中的奥秘真是不甚了解。这次就再深入一点,虽然还是不甚了解,但比上一篇,又前进了一小步。这次要说的就是WCF等一些技术用到的:动态创建一个对象,该对象可以转换为一个指定的接口,并且当在转换为接口的对象上调用接口的方法时,拦截所有调用,去做相应的事情。对于WCF来说,相应的事情就是:发起一个网络连接,访问远端服务,并将返回的数据转换为当前接口方法的返回值类型。下面演示的是如何创建一个客户端代理来访问WCF服务。首先我们假设服务端提供了如下服务:[ServiceContract] public interface IOrderService { [OperationContract] string GetOrder(int id); }客户端使用如下代码创建代理:IOrderService orderServiceProxy = ChannelFactoryIOrderService.CreateChannel(binding, address);string order = orderServiceProxy.GetOrder(1);可以看到,客户端并不知道这个接口的实现类,那么它是如何创建一个对象并能转换为IOrderService接口的呢?这正是今天要说的透明代理。什么是透明代理?MSDN上对此没有详细的描述,只有零零散散的一点注释,那就先看看这些注释吧!使用任何穿越远程边界的对象实际上都是在使用透明代理,透明代理会让你觉得远程对象好像就在客户端空间里。它会把所有调用通过远程调用框架转发给一个真实对象。透明代理对象寄宿在一个类型为RealProxy的托管类型实例内,RealProxy实现了转发透明代理传递过来的调用的功能。RealProxy对象继承了托管对象的语义,例如垃圾回收,支持成员和方法,也可以扩展为一个新类。所以RealProxy具有双重特性;一方面它具有跟远程对象一样的行为,另一方面它本身也是对象。最后,代理对象不必一定要用在远程调用里,它可以跟被代理对象在同一个AppDomain里。通过这段话,基本上已经了解了一些透明代理和真实代理(RealProxy)的概念。那么既然透明代理表现的和被代理对象行为几乎一模一样, 如何来判断一个对象是本身还是一个透明代理对象呢,使用RemotingServices.IsTransparentProxy方法可以帮助你进行判断。好吧,回归到我们当初设定的目标上来:创建一个透明代理,该代理可以被转换为一个指定的接口。因为代理的实际功能都是在RealProxy内部实现的,那么我需要看一看RealProxy应该如何使用,根据MSDN的描述,我们应该从RealProxy类继承,并必须重写Invoke方法。下面我就创建一个类InterfaceProxy,并让它从RealProxy继承。internal class InterfaceProxy : RealProxy { public InterfaceProxy(Type classToProxy) : base(classToProxy) { } public override IMessage Invoke(IMessage msg) { return msg; } }于是我们可以从该真实代理获取一个透明代理,如下:InterfaceProxy proxy = new InterfaceProxy(typeof(IOrderService));object tp = proxy.GetTransparentProxy();通过查看本地变量调试窗口,可以发现tp的类型为System.Runtime.Remoting.Proxies.__TransparentProxy,看上去我们获取了一个透明代理,那么下一步我们要把它转换为我们想要的接口并调用该接口方法“GetOrder”InterfaceProxy proxy = new InterfaceProxy(typeof(IOrderService));object tp = proxy.GetTransparentProxy();IOrderService serviceProxy = tp as IOrderService;serviceProxy.GetOrder(1);记住,先把断点打在InterfaceProxy的Invoke方法体中,运行程序,发现调用进入了Invoke,如果继续运行,就会发现在serviceProxy.GetOrder(1)处出现了异常。这是由于我们没有对该方法调用返回正确的结构,也就是说,我们需要在Invoke方法中返回有效的IMess
您可能关注的文档
最近下载
- (高清版)DB3706∕T 70-2020 斑海豹及其栖息地保护管理技术规范.pdf VIP
- 47[新课标人教版]七年级数学上册教案全册.doc
- 2025年职业健康检查专业技术人员继续教育考试试题.docx VIP
- 公务员申论考试辅导讲座.ppt VIP
- 地表水环境影响评价课件.pptx VIP
- 大众接总线can线装车指南.pdf VIP
- 2025年全国Ⅰ卷读后续写真题(亲情与谅解)课件+-2026届高三英语上学期一轮复习专项.pptx
- 2024-6湖南新高考物理答题卡 word版可以编辑.pdf
- 合同主体变三方协议.doc VIP
- 《轴对称图形》全章复习与巩固--巩固练习(基础).doc VIP
文档评论(0)