castle之动态代理
动态代理 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之动态代理相关推荐
- Castle动态代理拦截器可构建可重启的流
目录 介绍 用户故事4:在另一个AppDomain流中创建可中断且可重新启动的 实现--泛型流 实现--流引擎 实现--单元测试 总结 P.S. 本文演示了使用来自Castle Dynamic Pro ...
- Castle动态代理拦截器可跟踪模型更改和触发规则
目录 介绍 用户故事3:拦截模型调用 实现--模型 实现--代理工厂 实现--单元测试 实现--规则引擎 总结 从Github下载完整的解决方案 介绍 我想向您展示一个强大的开源库,称为Castle ...
- 实现一个基于动态代理的 AOP
实现一个基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的,后面有 ...
- .NET 下基于动态代理的 AOP 框架实现揭秘
.NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 基于 Roslyn 实现一个简单的条件解析引擎 执行过程中会 ...
- 【愚公系列】2022年03月 .NET架构班 021-ABP vNext 动态代理模块
文章目录 前言 1.Autofac概念 2.Castle概念 一.动态代理模块 1.EBusiness.Domain.Shared 2.使用 前言 abp的拦截器实现是基于Autofac.Extras ...
- 【spring】动态代理
代理 动态代理 特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法增强 分类:基于接口的动态代理.基于子类的动态代理 基于接口的动态代理: 涉及的类:Proxy 提供者:JDK ...
- (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- Java动态代理和静态代理区别
静态代理 package staticproxy;/*** 接口* @author newtouch**/ public interface IHello {public void sayHello( ...
- java动态代理【一】
java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...
最新文章
- Linux查看内存使用情况
- Python list(列表) 详细总结
- 快速打开计算机磁盘的软件,提升电脑运行效率, 你需要快速整理磁盘碎片的工具...
- Android系统介绍
- 解决GitHub中头像显示异常、设置不了头像、README图片无法显示等问题
- 内核中断处理流程_处理中断
- mpu6050 重力加速度_2021年高考物理一轮复习学与练 重力、弹力 、摩擦力 高中物理知识总结大全...
- python 集合 gather
- [BZOJ3696][FJSC2014]化合物(异或规则下的母函数)
- 计算机应用基础选择题占多少分,计算机应用基础练习题(选择题部分)..doc
- python贪吃蛇游戏无法运行_Python贪吃蛇游戏编写代码
- MTK平台系统稳定性分析
- [置顶] 可惜了,没有人可以代替你自己的思考
- Android系统的系统运行库层,Android系统框架
- 轮播图左右按钮会被选中的问题
- 【Android控件】呼吸效果的动画
- MapReduce明星搜索指数统计,找出人气王
- mybatis 的trim标签的使用,属性prefix,suffix,prefixOverrides,suffixOverrides
- python作图设置背景颜色_如何在matplotlib中设置绘图的外部背景颜色
- 智能秤方案设计——蓝牙体脂秤PCBA方案