zoukankan      html  css  js  c++  java
  • castle动态代理的使用

    转自:https://blog.csdn.net/educast/article/details/6565447#
    动态代理的原理


    原理其实很简单,就是在运行时生成新的对象,姑且叫做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. }  
    [c#] view plain copy
     
    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. }  
    [c#] view plain copy
     
    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#] view plain copy
     
    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. }  
    [c#] view plain copy
     
    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
    执行完毕

  • 相关阅读:
    一脚踩进java之基础篇07——数组
    一脚踩进java之基础篇06——流程控制语句(if...else,while,for,switch...case)
    一脚踩进java之基础篇05——运算符
    一脚踩进java之基础篇04——变量
    [转]进程间通信
    [转]netstat 命令详解
    僵尸进程
    如何进行表的复制
    解决system调用返回ECHILD的问题
    Oracle保留2位小数
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8360363.html
Copyright © 2011-2022 走看看