[转]基于Dynamic Proxy 技术的方法拦截器开发 来自<>代理技术--代码变得更简洁 在面向对象编程中,会用到大量的类,并且会多次调用类中的方法。有时可能需要对这些方法的调用进行一些控制。如在权限管理中,一些用户没有执行某些方法的权限。又如在日志系统中,在某个方法执行完后,将其执行的结果记录在日志中。处理这些需求的一般做法是在调用这些方法的地方加上适当的代码。如以下 C#代码如示: public class Class1 { public void MyMethod() { ... } static void Main() { Class1 c1 = new Class1(); if(permit()) { c1.MyMethod(); logger(); } } } 在以上代码中,permit()是一个得到MyMethod 方法执行权限的函数,如果 MyMethod 方法可以被执行,那么 permit()返回 true,否则,返回 false。logger()是记录日志的函数。 我们可以看出,在这段程序中存在一个问题,就是它的主要功能是执行 MyMethod 方法,至于权限控制以及日志功能只是它的次要功能(这里说它们是次要功能,并不是说它们不重要,而是说没有这些功能并不影响程序的核心功能的执行)。而将这些次要功能和程序的主要业务逻辑混在一起,如果程序所涉及的类比较多的话,这些次要功能的代码将和业务逻辑代码紧密地结合在一起,这样在修改某一部分时(比如换一个写日志的函数),必须要修改大量的代码。而且程序员在考虑业务逻辑的同时,还要关注这些次要功能,从而无法将精力集中在业务逻辑上。 根据以上在软件开发中存在的不足,人们提出了代理(Proxy)技术用以解决上述的问题。代理技术的基本原理是在待调用类和调用者之间加了一个代理类(Proxy Class),这个代理类有两个作用。第一个作用是执行被代理类的方法。第二个作用是在代理类中可以加入控制这个方法的代码,从而使调用者不必关心和自己的业务无关的事情。现将上例用代理技术重新实现,代码如下: 代码 public class Class1 { public virtual void MyMethod() { //…… } } public class ProxyClass1 : Class1 { public override void MyMethod() { if (permit()) { base.MyMethod(); logger(); } } } static class Program { //…… static void Main() { Class1 pc1 = new ProxyClass1(); pc1.MyMethod(); } //…… } 从以上代码可以看出,所有的次要功能代码 (在这里指权限和日志 )都被放到了代理类中...