动态代理 DynamicProxy,这里说的动态代理是直接使用Castle.net 中提供的,并非自己实现的,因为别人写的很好,拿着用就行了。

动态代理的工作模式

一般我们获取一个类型的实例都是通过 new 关键字,例如 var c = new Class1(); 通过动态代理的话,我们获取一个实例是通过代理方法获取的,generator.CreateClassProxy(type, interceptor); 其中Type是要代理的类型,也就是Class1(); interceptor则是实际执行代理的拦截器。

为什么要用动态代理:

简单的说,例如我Class1与Class2都有自己的方法,我现在想给这两给类的每个方法都添加一个日志操作,如果不通过代理我们怎么做呢?每个函数开始增加一句Log.Enter();结束的时候增加一个Log.Exit(); 通过动态代理,我们可以增加一个拦截器,拦截器中,可以先执行Log.Enter();然后执行实际操作,最后在执行Log.Exit();  这样我们就不需要去修改 Class1与Class2两个类。说白了就是为了符合OCP.

实现

 1  public interface ISaySomething
 2     {
 3         void sayHK();
 4     }
 5
 6     public class Say : ISaySomething
 7     {
 8         public virtual void sayHK()
 9         {
10             Console.WriteLine("hk");
11         }
12     }

这个方法一定要用虚方法,因为会被代理类重写。

 1  public class SayInterceptorProxy : IInterceptor
 2     {
 3         string _user;
 4         public SayInterceptorProxy(string user)
 5         {
 6             this._user = user;
 7         }
 8
 9         public void Intercept(IInvocation invocation)
10         {
11             if (_user == "hk")
12             {
13                 beforeDoSomething();
14                 invocation.Proceed();
15                 afterDoSomething()
16             }
17             else
18             {
19                 Console.WriteLine("{0}没有权限执行", _user);
20             }
21         }
22     }

这个是代理类,必须要继承 IInterceptor 接口 在执行你的逻辑方法之前或者之后,你都可以加上你自己的逻辑。其中 invocation 里面放的是代理方法的所有详细信息。

1  public void test()
2         {
3             ProxyGenerator proxyGenerator = new ProxyGenerator();
4             var handle = new SayInterceptorProxy[] { new SayInterceptorProxy("wy") };
5             ISaySomething iSay = proxyGenerator.CreateClassProxy<Say>(handle);
6             iSay.sayHK();
7         }

这是调用执行过程。

转载于:https://www.cnblogs.com/HKKD/p/7283810.html

castle之动态代理相关推荐

  1. Castle动态代理拦截器可构建可重启的流

    目录 介绍 用户故事4:在另一个AppDomain流中创建可中断且可重新启动的 实现--泛型流 实现--流引擎 实现--单元测试 总结 P.S. 本文演示了使用来自Castle Dynamic Pro ...

  2. Castle动态代理拦截器可跟踪模型更改和触发规则

    目录 介绍 用户故事3:拦截模型调用 实现--模型 实现--代理工厂 实现--单元测试 实现--规则引擎 总结 从Github下载完整的解决方案 介绍 我想向您展示一个强大的开源库,称为Castle ...

  3. 实现一个基于动态代理的 AOP

    实现一个基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的,后面有 ...

  4. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 基于 Roslyn 实现一个简单的条件解析引擎 执行过程中会 ...

  5. 【愚公系列】2022年03月 .NET架构班 021-ABP vNext 动态代理模块

    文章目录 前言 1.Autofac概念 2.Castle概念 一.动态代理模块 1.EBusiness.Domain.Shared 2.使用 前言 abp的拦截器实现是基于Autofac.Extras ...

  6. 【spring】动态代理

    代理 动态代理 特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法增强 分类:基于接口的动态代理.基于子类的动态代理 基于接口的动态代理: 涉及的类:Proxy     提供者:JDK ...

  7. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  8. Java动态代理和静态代理区别

    静态代理 package staticproxy;/*** 接口* @author newtouch**/ public interface IHello {public void sayHello( ...

  9. java动态代理【一】

    java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...

最新文章

  1. Linux查看内存使用情况
  2. Python list(列表) 详细总结
  3. 快速打开计算机磁盘的软件,提升电脑运行效率, 你需要快速整理磁盘碎片的工具...
  4. Android系统介绍
  5. 解决GitHub中头像显示异常、设置不了头像、README图片无法显示等问题
  6. 内核中断处理流程_处理中断
  7. mpu6050 重力加速度_2021年高考物理一轮复习学与练 重力、弹力 、摩擦力 高中物理知识总结大全...
  8. python 集合 gather
  9. [BZOJ3696][FJSC2014]化合物(异或规则下的母函数)
  10. 计算机应用基础选择题占多少分,计算机应用基础练习题(选择题部分)..doc
  11. python贪吃蛇游戏无法运行_Python贪吃蛇游戏编写代码
  12. MTK平台系统稳定性分析
  13. [置顶] 可惜了,没有人可以代替你自己的思考
  14. Android系统的系统运行库层,Android系统框架
  15. 轮播图左右按钮会被选中的问题
  16. 【Android控件】呼吸效果的动画
  17. MapReduce明星搜索指数统计,找出人气王
  18. mybatis 的trim标签的使用,属性prefix,suffix,prefixOverrides,suffixOverrides
  19. python作图设置背景颜色_如何在matplotlib中设置绘图的外部背景颜色
  20. 智能秤方案设计——蓝牙体脂秤PCBA方案

热门文章

  1. google nexus 5 刷机 卡刷 救砖教程
  2. 【小游戏】Random实现猜数字小游戏
  3. 在swt中获取jar包中的文件 uri is not hierarchical
  4. codevs 2612 最有分解方案 (贪心)
  5. Scalaz(32)- Free :lift - Monad生产线
  6. Linux-进程、进程组、作业、会话、控制终端详解
  7. 获取某字符 之后 之前
  8. Winsock服务器设计的四个关键问题
  9. 如何解决多线程并发问题
  10. 优秀程序员必须知道的32个算法,提高你的开发效率