zoukankan      html  css  js  c++  java
  • 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框架

      

  • 相关阅读:
    优先队列
    BFS和图的最短路径 279,127,126
    opencv常用函数
    图形图像概念
    缓存
    主板
    显卡
    cpu
    vs配置opencv(只需一次)
    附加依赖项、库目录、包含目录
  • 原文地址:https://www.cnblogs.com/EncryptingLife/p/5398500.html
Copyright © 2011-2022 走看看