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

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

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

动态代理实现(利用castle)

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

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

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

  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. /// <summary>
  13. /// 拦截器示例
  14. /// </summary>
  15. public class SampleInterceptor : IInterceptor
  16. {
  17. public SampleInterceptor()
  18. {
  19. //
  20. //TODO: 在此处添加构造函数逻辑
  21. //
  22. }
  23. public void Intercept(IInvocation invocation)
  24. {
  25. output("开始进入拦截器");
  26. MethodInfo concreteMethod = invocation.GetConcreteMethod();
  27. if (!invocation.MethodInvocationTarget.IsAbstract)
  28. {
  29. output("开始执行 " + concreteMethod.Name);
  30. //执行原对象中的方法
  31. invocation.Proceed();
  32. output("执行结果 " + invocation.ReturnValue);
  33. }
  34. output("执行完毕");
  35. }
  36. private void output(string Message)
  37. {
  38. HttpContext.Current.Response.Write(Message + "<br>");
  39. }
  40. }
  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. /// <summary>
  13. /// 拦截器示例
  14. /// </summary>
  15. public class SampleInterceptor : IInterceptor
  16. {
  17. public SampleInterceptor()
  18. {
  19. //
  20. //TODO: 在此处添加构造函数逻辑
  21. //
  22. }
  23. public void Intercept(IInvocation invocation)
  24. {
  25. output("开始进入拦截器");
  26. MethodInfo concreteMethod = invocation.GetConcreteMethod();
  27. if (!invocation.MethodInvocationTarget.IsAbstract)
  28. {
  29. output("开始执行 " + concreteMethod.Name);
  30. //执行原对象中的方法
  31. invocation.Proceed();
  32. output("执行结果 " + invocation.ReturnValue);
  33. }
  34. output("执行完毕");
  35. }
  36. private void output(string Message)
  37. {
  38. HttpContext.Current.Response.Write(Message + "<br>");
  39. }
  40. }

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

  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. /// <summary>
  11. ///IPerson 的摘要说明
  12. /// </summary>
  13. public interface IPerson
  14. {
  15. /// <summary>
  16. /// 姓名
  17. /// </summary>
  18. string Name { get; }
  19. /// <summary>
  20. /// 地址
  21. /// </summary>
  22. string Address { get; }
  23. /// <summary>
  24. /// 正在做什么
  25. /// </summary>
  26. /// <returns></returns>
  27. string Doing();
  28. }
  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. /// <summary>
  11. ///IPerson 的摘要说明
  12. /// </summary>
  13. public interface IPerson
  14. {
  15. /// <summary>
  16. /// 姓名
  17. /// </summary>
  18. string Name { get; }
  19. /// <summary>
  20. /// 地址
  21. /// </summary>
  22. string Address { get; }
  23. /// <summary>
  24. /// 正在做什么
  25. /// </summary>
  26. /// <returns></returns>
  27. string Doing();
  28. }

对接口的实现:Person.cs

  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. /// <summary>
  11. ///Person 的摘要说明
  12. /// </summary>
  13. public class Person : IPerson
  14. {
  15. public Person()
  16. {
  17. //
  18. //TODO: 在此处添加构造函数逻辑
  19. //
  20. }
  21. #region IPerson 成员
  22. public string Name
  23. {
  24. get { return "我是花生米"; }
  25. }
  26. public string Address
  27. {
  28. get { return "我住在 http://pignut-wang.iteye.com/ "; }
  29. }
  30. public string Doing()
  31. {
  32. return "我正在写blog";
  33. }
  34. #endregion
  35. }
  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. /// <summary>
  11. ///Person 的摘要说明
  12. /// </summary>
  13. public class Person : IPerson
  14. {
  15. public Person()
  16. {
  17. //
  18. //TODO: 在此处添加构造函数逻辑
  19. //
  20. }
  21. #region IPerson 成员
  22. public string Name
  23. {
  24. get { return "我是花生米"; }
  25. }
  26. public string Address
  27. {
  28. get { return "我住在 http://pignut-wang.iteye.com/ "; }
  29. }
  30. public string Doing()
  31. {
  32. return "我正在写blog";
  33. }
  34. #endregion
  35. }

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

  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. public partial class _Default : System.Web.UI.Page
  12. {
  13. protected void Page_Load(object sender, EventArgs e)
  14. {
  15. //创建拦截器对象
  16. SampleInterceptor Interceptor = new SampleInterceptor();
  17. //给person类生成代理
  18. ProxyGenerator Generator = new ProxyGenerator();
  19. IPerson p = Generator.CreateInterfaceProxyWithTarget<IPerson>(new Person(), Interceptor);
  20. //执行方法看效果
  21. p.Doing();
  22. }
  23. }
  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. public partial class _Default : System.Web.UI.Page
  12. {
  13. protected void Page_Load(object sender, EventArgs e)
  14. {
  15. //创建拦截器对象
  16. SampleInterceptor Interceptor = new SampleInterceptor();
  17. //给person类生成代理
  18. ProxyGenerator Generator = new ProxyGenerator();
  19. IPerson p = Generator.CreateInterfaceProxyWithTarget<IPerson>(new Person(), Interceptor);
  20. //执行方法看效果
  21. p.Doing();
  22. }
  23. }

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

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

castle动态代理的使用的更多相关文章

  1. Castle动态代理拦截

    比如现在有一个方法,进行积分奖励 PointAdd 在不改变原来方法的基础上,增加积分奖励的日志 using Castle.DynamicProxy; public class AuditTraceI ...

  2. Aop之使用Castle动态代理实现对方法的拦截

    using System; using System.Linq; using Castle.DynamicProxy; namespace AopTest { class AopTest { stat ...

  3. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  4. castle之动态代理

    动态代理 DynamicProxy,这里说的动态代理是直接使用Castle.net 中提供的,并非自己实现的,因为别人写的很好,拿着用就行了. 动态代理的工作模式: 一般我们获取一个类型的实例都是通过 ...

  5. Castle Windsor 的动态代理类如何获取实际类型

    问题 在实际开发过程当中我们可能会针对某些类型使用动态代理技术(AOP),注入了一些拦截器进行处理,但是一旦某个类型被动态代理了,那么就会生成一个代理类.这个时候在该类内部使用 GetType() 方 ...

  6. ASP.NET Core搭建多层网站架构【9.2-使用Castle.Core实现动态代理拦截器】

    2020/01/31, ASP.NET Core 3.1, VS2019, Autofac.Extras.DynamicProxy 4.5.0, Castle.Core.AsyncIntercepto ...

  7. 不用Unity库,利用.NET动态代理自己实现AOP

    AOP意为面向切面的程序设计,主要表现为对不同的代码逻辑进行隔离,从而降低不同业务逻辑之间的耦合性,AOP又理解为“横切”,可以在不改变原有实现的情况下,对代码进行拦截和扩展,如果原有设计像一个瓶子, ...

  8. Autofac高级用法之动态代理

    前言 Autofac的DynamicProxy来自老牌的Castle项目.DynamicProxy(以下称为动态代理)起作用主要是为我们的类生成一个代理类,这个代理类可以在我们调用原本类的方法之前,调 ...

  9. 5.动态代理AOP实现-DynamicProxy模式

    通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能 ...

随机推荐

  1. PHP IF ELSE简化/三元一次式的使用

    一般我们会这样写: <? if($_GET['time']==null) { $time = time(); } else { $time = $_GET['time']; } echo $ti ...

  2. JS中var声明与function声明两种函数声明方式的区别

    JS中常见的两种函数声明(statement)方式有这两种: // 函数表达式(function expression) var h = function() { // h } // 函数声明(fun ...

  3. BZOJ3152[Ctsc2013]组合子逻辑——堆+贪心

    题目链接: BZOJ3152 题目大意: 一开始有一个括号包含[1,n],你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数要<=这个括号左端点那个数的大小,当一个括号包含另一个括号 ...

  4. BZOJ2821 作诗(分块)

    和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...

  5. python3网络爬虫(2.1):爬取堆糖美女

    额,明明记得昨晚存了草稿箱,一觉醒来没了,那就简写点(其实是具体怎么解释我也不太懂/xk,纯属个人理解,有错误还望指正) 环境: 版本:python3 IDE:pycharm2017.3.3 浏览器: ...

  6. 自学Zabbix8.1 Regular expressions 正则表达式

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix8.1 Regular expressions 正则表达式 1. 配置 点击Adm ...

  7. 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表  1. Actions表 ...

  8. Intent 跳转Activity

    Intent 跳转 显示跳转(用类名跳转) Intent i = new Intent(a.this,b.class); 隐士跳转 自定义Action <!--配置跳转Activity--> ...

  9. HNOI2018题解

    在此处输入标题 标签(空格分隔): 未分类 重做了一遍,本来以为很快的,结果搞了一天... 寻宝游戏 可以发现只有\(\&0\)和\(|1\)会对答案有影响 那么对于每一位,我们只要知道最后一 ...

  10. 批量导入导出站点权限site permissions

    批量导入站点权限   cls $Web = Get-SPWeb "http://16.178.115.14:91/" Get-Content c:\export\account.t ...