castle之动态代理

动态代理 DynamicProxy,这里说的动态代理是直接使用Castle.net 中提供的,并不是本身实现的,由于别人写的很好,拿着用就好了。函数

动态代理的工做模式this

通常咱们获取一个类型的实例都是经过 new 关键字,例如 var c = new Class1(); 经过动态代理的话,咱们获取一个实例是经过代理方法获取的,generator.CreateClassProxy(type, interceptor); 其中Type是要代理的类型,也就是Class1(); interceptor则是实际执行代理的拦截器。spa

为何要用动态代理:.net

简单的说,例如我Class1与Class2都有本身的方法,我如今想给这两给类的每一个方法都添加一个日志操做,若是不经过代理咱们怎么作呢?每一个函数开始增长一句Log.Enter();结束的时候增长一个Log.Exit(); 经过动态代理,咱们能够增长一个拦截器,拦截器中,能够先执行Log.Enter();而后执行实际操做,最后在执行Log.Exit();  这样咱们就不须要去修改 Class1与Class2两个类。说白了就是为了符合OCP.代理

实现日志

 1  public interface ISaySomething
 2     {
 3         void sayHK();
 4     }
 5 
 6     public class Say : ISaySomething
 7     {
 8         public virtual void sayHK()
 9         {
10             Console.WriteLine("hk");
11         }
12     }

这个方法必定要用虚方法,由于会被代理类重写。code

 1  public class SayInterceptorProxy : IInterceptor
 2     {
 3         string _user;
 4         public SayInterceptorProxy(string user)
 5         {
 6             this._user = user;
 7         }
 8 
 9         public void Intercept(IInvocation invocation)
10         {
11             if (_user == "hk")
12             {
13                 beforeDoSomething();
14                 invocation.Proceed();
15                 afterDoSomething()
16             }
17             else
18             {
19                 Console.WriteLine("{0}没有权限执行", _user);
20             }
21         }
22     }

这个是代理类,必需要继承 IInterceptor 接口 在执行你的逻辑方法以前或者以后,你均可以加上你本身的逻辑。其中 invocation 里面放的是代理方法的全部详细信息。blog

1  public void test()
2         {
3             ProxyGenerator proxyGenerator = new ProxyGenerator();
4             var handle = new SayInterceptorProxy[] { new SayInterceptorProxy("wy") };
5             ISaySomething iSay = proxyGenerator.CreateClassProxy<Say>(handle);
6             iSay.sayHK();
7         }

这是调用执行过程。继承

相关文章
相关标签/搜索