動態代理 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 }
這是調用執行過程。繼承