博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

castle动态代理的使用

Posted on 2011-06-24 12:58  codingsilence  阅读(492)  评论(0编辑  收藏  举报

动态代理的原理


原理其实很简单,就是在运行时生成新的对象,姑且叫做T,并使T继承自需要代理的原对象,调用过程实际是调用了新的对象T.

通过对T中方法或属性等,添加些自定义的操作,从而实现对原对象访问的封装.

 

动态代理实现(利用castle)

 

castle的动态代理需要下面几步

  1. 自定义一个拦截器,必须实现 IInterceptor 接口
  2. 使用 ProxyGenerator 对象创建代理对象,对象中包含很多方法
  3. 对原对象的所有操作,都使用代理对象代替
  4. 在拦截器的方法中,加入自定义的操作,比如 记录参数调用日志,异常记录等.

 

 简单拦截器实现代码:  SampleInterceptor.cs

 

C#代码  
  1. using System;   
  2. using System.Data;   
  3. using System.Configuration;   
  4. using System.Web;   
  5. using System.Web.Security;   
  6. using System.Web.UI;   
  7. using System.Web.UI.HtmlControls;   
  8. using System.Web.UI.WebControls;   
  9. using System.Web.UI.WebControls.WebParts;   
  10. using Castle.Core.Interceptor;   
  11. using System.Reflection;   
  12.   
  13. /// <summary>   
  14. /// 拦截器示例   
  15. /// </summary>   
  16. public class SampleInterceptor : IInterceptor   
  17. {   
  18.     public SampleInterceptor()   
  19.     {   
  20.         //   
  21.         //TODO: 在此处添加构造函数逻辑   
  22.         //   
  23.     }   
  24.   
  25.     public void Intercept(IInvocation invocation)   
  26.     {   
  27.   
  28.         output("开始进入拦截器");   
  29.   
  30.         MethodInfo concreteMethod = invocation.GetConcreteMethod();   
  31.   
  32.            
  33.         if (!invocation.MethodInvocationTarget.IsAbstract)   
  34.         {   
  35.             output("开始执行 " + concreteMethod.Name);   
  36.   
  37.             //执行原对象中的方法   
  38.             invocation.Proceed();   
  39.   
  40.             output("执行结果 " + invocation.ReturnValue);   
  41.         }   
  42.   
  43.         output("执行完毕");   
  44.     }   
  45.   
  46.     private void output(string Message)   
  47.     {   
  48.         HttpContext.Current.Response.Write(Message + "<br>");   
  49.     }   
  50. }  

 

 示例中使用的接口 : IPerson.cs

 

C#代码  
  1. using System;   
  2. using System.Data;   
  3. using System.Configuration;   
  4. using System.Web;   
  5. using System.Web.Security;   
  6. using System.Web.UI;   
  7. using System.Web.UI.HtmlControls;   
  8. using System.Web.UI.WebControls;   
  9. using System.Web.UI.WebControls.WebParts;   
  10.   
  11. /// <summary>   
  12. ///IPerson 的摘要说明   
  13. /// </summary>   
  14. public interface IPerson   
  15. {   
  16.     /// <summary>   
  17.     /// 姓名   
  18.     /// </summary>   
  19.     string Name { get; }   
  20.   
  21.     /// <summary>   
  22.     /// 地址   
  23.     /// </summary>   
  24.     string Address { get; }   
  25.   
  26.     /// <summary>   
  27.     /// 正在做什么   
  28.     /// </summary>   
  29.     /// <returns></returns>   
  30.     string Doing();   
  31. }  

 

对接口的实现:Person.cs

C#代码  
  1. using System;   
  2. using System.Data;   
  3. using System.Configuration;   
  4. using System.Web;   
  5. using System.Web.Security;   
  6. using System.Web.UI;   
  7. using System.Web.UI.HtmlControls;   
  8. using System.Web.UI.WebControls;   
  9. using System.Web.UI.WebControls.WebParts;   
  10.   
  11. /// <summary>   
  12. ///Person 的摘要说明   
  13. /// </summary>   
  14. public class Person : IPerson   
  15. {   
  16.     public Person()   
  17.     {   
  18.         //   
  19.         //TODO: 在此处添加构造函数逻辑   
  20.         //   
  21.     }  
  22.  
  23.     #region IPerson 成员   
  24.   
  25.     public string Name   
  26.     {   
  27.         get { return "我是花生米"; }   
  28.     }   
  29.   
  30.     public string Address   
  31.     {   
  32.         get { return "我住在 http://pignut-wang.iteye.com/ "; }   
  33.     }   
  34.   
  35.     public string Doing()   
  36.     {   
  37.         return "我正在写blog";   
  38.     }  
  39.  
  40.     #endregion   
  41. }  

 

所有要使用到的对象都准备好了,下面就是调用的代码

C#代码  
  1. using System;   
  2. using System.Configuration;   
  3. using System.Data;   
  4. using System.Web;   
  5. using System.Web.Security;   
  6. using System.Web.UI;   
  7. using System.Web.UI.HtmlControls;   
  8. using System.Web.UI.WebControls;   
  9. using System.Web.UI.WebControls.WebParts;   
  10. using Castle.DynamicProxy;   
  11.   
  12. public partial class _Default : System.Web.UI.Page    
  13. {   
  14.     protected void Page_Load(object sender, EventArgs e)   
  15.     {   
  16.         //创建拦截器对象   
  17.         SampleInterceptor Interceptor = new SampleInterceptor();   
  18.            
  19.         //给person类生成代理   
  20.         ProxyGenerator Generator = new ProxyGenerator();   
  21.         IPerson p = Generator.CreateInterfaceProxyWithTarget<IPerson>(new Person(), Interceptor);   
  22.   
  23.         //执行方法看效果   
  24.         p.Doing();   
  25.     }   
  26. }  

 

执行的效果就是在页面上输出4句话,如下

 

开始进入拦截器
开始执行 Doing
执行结果 我正在写blog
执行完毕

 

动态代理的应用

 

这个我就不罗唆说了,随便搜一下,大把的,只说一句.

主要用于和业务无关几乎每个方法都要用到的操作,如权限验证,日志记录,自动事务控制....反正很多了.