C#实现动态代理

C#实现动态代理

ID:37462333

大小:105.00 KB

页数:16页

时间:2019-05-24

C#实现动态代理_第1页
C#实现动态代理_第2页
C#实现动态代理_第3页
C#实现动态代理_第4页
C#实现动态代理_第5页
资源描述:

《C#实现动态代理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、窗体顶端[转]基于DynamicProxy技术的方法拦截器开发  来自<>代理技术--代码变得更简洁  在面向对象编程中,会用到大量的类,并且会多次调用类中的方法。有时可能需要对这些方法的调用进行一些控制。如在权限管理中,一些用户没有执行某些方法的权限。又如在日志系统中,在某个方法执行完后,将其执行的结果记录在日志中。处理这些需求的一般做法是在调用这些方法的地方加上适当的代码。如以下C#代码如示:publicclassClass1{publicvoidMyMethod(){..

2、.}staticvoidMain(){Class1c1=newClass1();if(permit()){c1.MyMethod();logger();}}}  在以上代码中,permit()是一个得到MyMethod方法执行权限的函数,如果MyMethod方法可以被执行,那么permit()返回true,否则,返回false。logger()是记录日志的函数。  我们可以看出,在这段程序中存在一个问题,就是它的主要功能是执行MyMethod方法,至于权限控制以及日志功能只是它的次要功能(这里说它

3、们是次要功能,并不是说它们不重要,而是说没有这些功能并不影响程序的核心功能的执行)。而将这些次要功能和程序的主要业务逻辑混在一起,如果程序所涉及的类比较多的话,这些次要功能的代码将和业务逻辑代码紧密地结合在一起,这样在修改某一部分时(比如换一个写日志的函数),必须要修改大量的代码。而且程序员在考虑业务逻辑的同时,还要关注这些次要功能,从而无法将精力集中在业务逻辑上。  根据以上在软件开发中存在的不足,人们提出了代理(Proxy)技术用以解决上述的问题。代理技术的基本原理是在待调用类和调用者之间加了

4、一个代理类(ProxyClass),这个代理类有两个作用。第一个作用是执行被代理类的方法。第二个作用是在代理类中可以加入控制这个方法的代码,从而使调用者不必关心和自己的业务无关的事情。现将上例用代理技术重新实现,代码如下:代码publicclassClass1{publicvirtualvoidMyMethod(){//……}}publicclassProxyClass1:Class1{publicoverridevoidMyMethod(){if(permit()){base.MyMethod(

5、);logger();}}}staticclassProgram{//……staticvoidMain(){Class1pc1=newProxyClass1();pc1.MyMethod();}//……}   从以上代码可以看出,所有的次要功能代码(在这里指权限和日志)都被放到了代理类中,而在主程序中只有和业务逻辑相关的代码(在这里指MyMethod方法)。从而可以达到将次要功能和主要功能分开的目的。  但使用代理技术也有其不足之处。从以上代码可以看出,如果在Class1中加入一个方法,那么就得在

6、ProxyClass1中加入一个方法来override。如果有非常多的类,那么工作量是相当巨大的,并且有很多重复代码。于是一种经过改良的代理技术出现了,这就是下面要介绍的动态代理(DynamicProxy)技术。它的基本原理和代理技术类似,只是生成代理类是完全自动的,而且可以对方法进行匹配控制(如对所有以My开头的方法进行控制)。动态代理(DynamicProxy)——更快捷的代理技术  动态代理(DynamicProxy)从它的名字就可以看出这项技术的核心就是“动态”。它可以根据被代理类自动生成

7、代理类。如果要向Class1中增加或删除方法时,可以完全不用考虑代理类的事情,因为这些代理类都是自动生成的,调用者根本就感觉不到。  DynamicProxy技术的基本原理是通过扫描被代理类的所有public方法,并且自动生成一个从被代理类继承的类,然后在这个生成的类中override这些public方法。说到这,需要解释一下自动生成代理类。这里说的自动生成,并不是象我们平常所说的生成源代码,而是直接使用中间语言(IntermedialLanguage)直接在内存中生成。这样在速度上和源码编译而成

8、的中间语言相近。我们可以利用ReflectionEmitAPI来直接生成中间语言。下面就详细介绍一下自动生成动态代理类的过程。生成中间语言的先期工作——初始化  为了生成中间语言,需要一个ModuleBuilder对象。Module在Assembly中相当于资源(如Class,Interface,Enum等)的集合,一个Assembly中可以有多个Module。下面是实现初始化Module的代码: 代码privateModuleBuilderm_Module;privateAsse

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。