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         }

這是調用執行過程。繼承

相關文章
相關標籤/搜索