這里主要介紹使用castle這個動態代理,在.net一些開源的框架里可以找到它的影子,就連微軟的rchard也是使用這個進行方法攔截等可以基於這個進行方法攔截,在這個方面PostSharp算是比較好用的,可以跟使用屬性一樣使用沒有代碼侵入,可是這個是收費,postsharp使用的是運行時注入,這個在之前的文章已經說過這里不再重復說,這里就直接進入正題。
這里介紹先DynamicProxy的方法攔截功能先來個例子
先定義一個類
public class MyClass : IMyClass { public virtual void MyMethod() { Console.WriteLine("My Mehod"); } }
virtual這個算是castle的一個標志,不管是方法或者是屬性都要這個。應該在NHibernate里都見過了。這個就是要代理的類啦,接下來定義攔截器
public class TestIntercept : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine("111111111111"); invocation.Proceed(); Console.WriteLine("222"); } }
這個就是攔截器啦進行方法攔截就靠這個了,這個也可以跟類一樣使用有參構造,比如也可以這樣子
1 [Serializable] 2 public class TransactionWithRetries : IInterceptor 3 { 4 private readonly Int32 _maxRetries; 5 6 public TransactionWithRetries(Int32 maxRetries) 7 { 8 _maxRetries = maxRetries; 9 } 10 11 public void Intercept(IInvocation invocation) 12 { 13 14 Console.WriteLine("before22222"); 15 var successed = false; 16 var retries = _maxRetries; 17 while (!successed) 18 { 19 using (var trans = new TransactionScope()) 20 { 21 try 22 { 23 Console.WriteLine("before"); 24 invocation.Proceed(); 25 Console.WriteLine("End"); 26 trans.Complete(); 27 } 28 catch 29 { 30 if (retries >= 0) 31 { 32 Console.WriteLine("Retrying"); 33 retries--; 34 } 35 else 36 { 37 throw; 38 } 39 } 40 } 41 } 42 43 } 44 45 46 }
這個時候可以傳遞參數進來,這個只是使用事務,至於權限以及日志什么的也類似寫在方法攔截里就可以了
最后到了出結果的時候了
var proxyGenerate = new ProxyGenerator(); TestIntercept t=new TestIntercept(); var pg = proxyGenerate.CreateClassProxy<MyClass>(t); pg.MyMethod();
最后執行起來是這個樣子的結果
11111111
My Mehod
222
可以看到執行順序是先進入攔截器里面,然后執行方法。下一篇寫寫IOC框架