使用动态代理,提高工作效率
我在ESBasic.Emit中实现了对这些截获的支持。
首先,介绍两个截获者:
/// IMethodInterceptor 对方法进行截获并加入预处理和后处理。
/// </summary>
public interface IMethodInterceptor
{
void PreProcess(InterceptedMethod method);
void PostProcess(InterceptedMethod method ,object returnVal);
}
IMethodInterceptor 很容易理解,用于为截获插入预处理、后处理。这个非常容易理解。
/// IAroundInterceptor 对方法进行Around截获处理。注意,必须要触发目标方法的调用。
/// </summary>
public interface IAroundInterceptor
{
object AroundCall(InterceptedMethod method);
}
Around处理由IAroundInterceptor完成。什么是Around处理了?比如,我们想捕获目标方法的异常,需要使用TryCatch将目标方法Around起来,这就是Around处理的一个例子。
在上面的接口方法中都有一个参数InterceptedMethod,它封装了被截获的目标方法的基本信息。
{
#region Ctor
public InterceptedMethod() { }
public InterceptedMethod(object _target, MethodInfo _method, object[] paras)
{
this.target = _target;
this.method = _method;
this.arguments = paras;
}
#endregion
#region Method
private MethodInfo method;
/// <summary>
/// Method 被截获的目标方法
/// </summary>
public MethodInfo Method
{
get { return method; }
set { method = value; }
}
#endregion
#region Target
private object target;
/// <summary>
/// Target 被截获的方法需要在哪个对象上调用。
/// </summary>
public object Target
{
get { return target; }
set { target = value; }
}
#endregion
#region Arguments
private object[] arguments;
/// <summary>
/// Arguments 调用被截获的方法的参数
/// </summary>
public object[] Arguments
{
get { return arguments; }
set { arguments = value; }
}
#endregion
#region Invoke
/// <summary>
/// Invoke 执行目标方法
/// </summary>
public object Invoke()
{
return this.method.Invoke(this.target, this.arguments);
}
#endregion
}
好,如何使用ESBasic.Emit来创建动态代理了?很简单,你只需要调用
如果不需要某种截获处理,对应的参数传入null即可。
举个例子,我们需要使用动态代理截获IComputer所有方法调用抛出的异常,并记录日志。IComputer定义如下:
{
int Add(int a, int b);
}
public class Computer : IComputer
{
public int Add(int a, int b)
{
throw new Exception("TestException");
return a + b;
}
}
我可以使用Around截获者来截获异常,所以我实现一个自己的IAroundInterceptor:
{
#region IAroundInterceptor 成员
public object AroundCall(InterceptedMethod method)
{
try
{
return method.Invoke();
}
catch (Exception ee)
{
ee = ee;
//.. log Exception
throw;
}
}
#endregion
}
现在,我们可以这样获得针对IComputer的动态代理的引用:
proxy.Add(1, 2);
这样就ok了,Add方法抛出的异常会被ExceprionAroundInterceptor截获。
最后,提醒一下,如果你让Computer不从IComputer继承,运行结果也一样。你应该已经看到DynamicProxyFactory.CreateAopProxy方法的第一个参数是object类型,而不是泛型T,这说明只要对应的object包含了和目标接口一样的方法(签名完全一致)就可以 -- 这就是所谓的“换脸”能力,可以在这里看到更详细的说明。
由于动态代理是使用Emit发射实现,所以效率上来说,和你手写的代码是没有区别的。
下载 ESBasic.Emit.dll。
使用动态代理,提高工作效率相关推荐
- cpu java poi 导出_让 Java 开发更简单,提高工作效率 | Gitee 项目推荐
1.项目名称:基于 Spring Boot 的权限管理系统 项目简介:Good 权限管理系统是作者学习 springBoot 时基于 springBoot 开发的一套轻量级的权限系统,其目的是形成一套 ...
- 开发人员该选择什么大数据工具提高工作效率?
开发人员该选择什么大数据工具提高工作效率? 海量数据使得数据分析工作变得繁重困难,开发人员选择合适的大数据工具来开发大数据系统成为新的挑战.因此开发人员要根据不同的数据处理方式对大数据工具进行分类. ...
- 这5个电脑软件提高工作效率1000%,装机必备
1.桌面日历 当我们工作之后,或者岁数大了之后,经常会忘记事情,这时候我们往往会通过记事本辅助我们记忆,写记事本的好处就是将需要做的事都列出来,让我们称之为[代办事项] 什么是[代办事项]:就是你把每 ...
- 企业即时通讯软件提高工作效率的三个要点
企业内部员工工作效率低一直是阻碍企业发展的重大问题,而内部的工作很多时候都需要同事之间的协同配合.所以想要提高企业的生产力,员工的办公效率.第一步,就是解决沟通问题.比如公司部门之间的物理距离大,还要 ...
- Windows 下有哪些能极大地提高工作效率的软件?
在快节奏的环境下,依旧有多人都只会一板一眼的做事,不会灵活办事.就产品经理工作上来说,明明有很多便捷提高工作效率的软件或者模板可以用,但有一部分职场小白偏偏要手动分析.重新制表,不会去套模版.结果费事 ...
- Unity提高工作效率的终极指南
本套课程指南通过关于如何更快.更智能地工作的最新技术,帮助Unity创作者节省时间并提高工作效率 你会学到: Unity的创建者节省了时间,提高了生产力. 关于如何更快地使用程序员和艺术家工具集的技巧 ...
- 5个可以帮助你提高工作效率的新AI工具
作者 | Kyrylo Lyzanets 译者 | 火火酱 编辑 | Carol 出品 | AI科技大本营(ID: rgznai100) 毫无意义的新闻.故事和活动会占用你每天多少的工作时间?假如你是 ...
- 番茄工作法:番茄时间管理方法与番茄工作法软件图解提高工作效率
番茄工作法 番茄工作法(又称为:番茄时间管理方法)是简单易行的GTD时间管理方法.番茄工作法是选择一个待办事项任务,将番茄时间设为25分钟,在此期间专注工作.不允许做与该待办事项任务无关的任何事情,直 ...
- 推荐8个可以显著提高工作效率的办公神器
分享8个可以显著提高工作效率的办公神器. 1.多译 多译是一款非常好用且高效的桌面端翻译工具,目前支持MacOS与Windows系统.使用多译,从文段翻译.截图翻译到字典查词,从自动识别.合并换行到自 ...
- 提高工作效率,请收下这8个神器
给大家分享8个能提高办公效率的神器. 1.CleverPDF CleverPDF是一个专业的PDF文档处理网站,聚合了44个PDF相关工具,一站式解决PDF大部分问题.CleverPDF目前完全免费, ...
最新文章
- MySql报2006error错误的解决方法(数据过大)
- Tomcat学习总结(1)——Tomcat入门教程
- C:03---运算符优先级
- 针对C++异常的学习
- 学计算机和电脑办公的区别,自学编程和计算机科班出身的差别在哪?
- [开源]在iOS上实现Android风格的控件Toast
- linux环境snmptrap告警命令中间服务器接收和转发配置
- 青岛地区服务器不稳定怎么办,青岛联通现大面积DNS故障 用户该如何上网
- 理财产品的收益率也抵不上通货膨胀
- 网贷风控体系之-系统架构
- codevs 2382 [CSTC2007] 挂缀 贪心
- 全面发展还是术业专攻?这就是答案
- eclipse Job
- To B 业务 vs To C 业务
- mysql_connect函数怎么调用,PHP连接MySQL数据库的连接函数mysql_connect的第三个参数是( )。...
- 阿里巴巴DevOps实践手册 附下载链接
- Java Selenium防止被网站检测
- 小说作者推荐:渡山山合集
- springboot+easyexcel实现固定表头+动态表头的数据导出
- Briefings in Bioinformatics2021 | 从头药物设计的深度生成模型的综合性评估
热门文章
- LeetCode House Robber II(动态规划)
- LeetCode Maximum Depth of Binary Tree
- 网络编程学习笔记(getsockopt和setsockopt函数)
- Button的使用(三):处理点击事件
- Activity的用法(一):Notification Activity
- rest-framework 版本控制
- Analysis of the Clustering Properties of the Hilbert Space-Filling Curve 论文笔记
- 看了毁你三观的PCB设计理论 高速PCB外层还要不要覆铜了
- 获取当前应用程序的文件名
- 在myeclipse当中使用正则表达式去除单行注释