AOP之Castle DynamicProxy 動態代理


  這里主要介紹使用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框架

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM