动态代理的一个最主要的应用场合就是实现AOP - 截获方法调用,加入自己的预处理、后处理或Around处理。
    我在ESBasic.Emit中实现了对这些截获的支持。
    首先,介绍两个截获者:

    /// <summary>
    /// IMethodInterceptor 对方法进行截获并加入预处理和后处理。
    /// </summary>
    public interface IMethodInterceptor
    {
        void PreProcess(InterceptedMethod method);

void PostProcess(InterceptedMethod method ,object returnVal);
    }

IMethodInterceptor 很容易理解,用于为截获插入预处理、后处理。这个非常容易理解。

     /// <summary>
    /// IAroundInterceptor 对方法进行Around截获处理。注意,必须要触发目标方法的调用。
    /// </summary>
    public interface IAroundInterceptor
    {
        object AroundCall(InterceptedMethod method);
    }

Around处理由IAroundInterceptor完成。什么是Around处理了?比如,我们想捕获目标方法的异常,需要使用TryCatch将目标方法Around起来,这就是Around处理的一个例子。
    在上面的接口方法中都有一个参数InterceptedMethod,它封装了被截获的目标方法的基本信息。

public sealed class 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来创建动态代理了?很简单,你只需要调用

public static TInterface CreateAopProxy<TInterface>(object origin, IMethodInterceptor methodInterceptor, IAroundInterceptor aroundInterceptor)

如果不需要某种截获处理,对应的参数传入null即可。
    举个例子,我们需要使用动态代理截获IComputer所有方法调用抛出的异常,并记录日志。IComputer定义如下:

    public interface 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:

    public class ExceprionAroundInterceptor : IAroundInterceptor
    {
        #region IAroundInterceptor 成员
        public object AroundCall(InterceptedMethod method)
        {
            try
            {
                return method.Invoke();
            }
            catch (Exception ee)
            {
                ee = ee;
                //.. log Exception

throw;
            }
        }
        #endregion
    }

现在,我们可以这样获得针对IComputer的动态代理的引用:

    IComputer proxy = ESBasic.Emit.Application.DynamicProxyFactory.CreateAopProxy<IComputer>(new Computer() ,null ,new ExceprionAroundInterceptor()) ;
    proxy.Add(1, 2);

这样就ok了,Add方法抛出的异常会被ExceprionAroundInterceptor截获。

最后,提醒一下,如果你让Computer不从IComputer继承,运行结果也一样。你应该已经看到DynamicProxyFactory.CreateAopProxy方法的第一个参数是object类型,而不是泛型T,这说明只要对应的object包含了和目标接口一样的方法(签名完全一致)就可以 -- 这就是所谓的“换脸”能力,可以在这里看到更详细的说明。
    由于动态代理是使用Emit发射实现,所以效率上来说,和你手写的代码是没有区别的。

下载 ESBasic.Emit.dll。

使用动态代理,提高工作效率相关推荐

  1. cpu java poi 导出_让 Java 开发更简单,提高工作效率 | Gitee 项目推荐

    1.项目名称:基于 Spring Boot 的权限管理系统 项目简介:Good 权限管理系统是作者学习 springBoot 时基于 springBoot 开发的一套轻量级的权限系统,其目的是形成一套 ...

  2. 开发人员该选择什么大数据工具提高工作效率?

    开发人员该选择什么大数据工具提高工作效率? 海量数据使得数据分析工作变得繁重困难,开发人员选择合适的大数据工具来开发大数据系统成为新的挑战.因此开发人员要根据不同的数据处理方式对大数据工具进行分类. ...

  3. 这5个电脑软件提高工作效率1000%,装机必备

    1.桌面日历 当我们工作之后,或者岁数大了之后,经常会忘记事情,这时候我们往往会通过记事本辅助我们记忆,写记事本的好处就是将需要做的事都列出来,让我们称之为[代办事项] 什么是[代办事项]:就是你把每 ...

  4. 企业即时通讯软件提高工作效率的三个要点

    企业内部员工工作效率低一直是阻碍企业发展的重大问题,而内部的工作很多时候都需要同事之间的协同配合.所以想要提高企业的生产力,员工的办公效率.第一步,就是解决沟通问题.比如公司部门之间的物理距离大,还要 ...

  5. Windows 下有哪些能极大地提高工作效率的软件?

    在快节奏的环境下,依旧有多人都只会一板一眼的做事,不会灵活办事.就产品经理工作上来说,明明有很多便捷提高工作效率的软件或者模板可以用,但有一部分职场小白偏偏要手动分析.重新制表,不会去套模版.结果费事 ...

  6. Unity提高工作效率的终极指南

    本套课程指南通过关于如何更快.更智能地工作的最新技术,帮助Unity创作者节省时间并提高工作效率 你会学到: Unity的创建者节省了时间,提高了生产力. 关于如何更快地使用程序员和艺术家工具集的技巧 ...

  7. 5个可以帮助你提高工作效率的新AI工具

    作者 | Kyrylo Lyzanets 译者 | 火火酱 编辑 | Carol 出品 | AI科技大本营(ID: rgznai100) 毫无意义的新闻.故事和活动会占用你每天多少的工作时间?假如你是 ...

  8. 番茄工作法:番茄时间管理方法与番茄工作法软件图解提高工作效率

    番茄工作法 番茄工作法(又称为:番茄时间管理方法)是简单易行的GTD时间管理方法.番茄工作法是选择一个待办事项任务,将番茄时间设为25分钟,在此期间专注工作.不允许做与该待办事项任务无关的任何事情,直 ...

  9. 推荐8个可以显著提高工作效率的办公神器

    分享8个可以显著提高工作效率的办公神器. 1.多译 多译是一款非常好用且高效的桌面端翻译工具,目前支持MacOS与Windows系统.使用多译,从文段翻译.截图翻译到字典查词,从自动识别.合并换行到自 ...

  10. 提高工作效率,请收下这8个神器

    给大家分享8个能提高办公效率的神器. 1.CleverPDF CleverPDF是一个专业的PDF文档处理网站,聚合了44个PDF相关工具,一站式解决PDF大部分问题.CleverPDF目前完全免费, ...

最新文章

  1. MySql报2006error错误的解决方法(数据过大)
  2. Tomcat学习总结(1)——Tomcat入门教程
  3. C:03---运算符优先级
  4. 针对C++异常的学习
  5. 学计算机和电脑办公的区别,自学编程和计算机科班出身的差别在哪?
  6. [开源]在iOS上实现Android风格的控件Toast
  7. linux环境snmptrap告警命令中间服务器接收和转发配置
  8. 青岛地区服务器不稳定怎么办,青岛联通现大面积DNS故障 用户该如何上网
  9. 理财产品的收益率也抵不上通货膨胀
  10. 网贷风控体系之-系统架构
  11. codevs 2382 [CSTC2007] 挂缀 贪心
  12. 全面发展还是术业专攻?这就是答案
  13. eclipse Job
  14. To B 业务 vs To C 业务
  15. mysql_connect函数怎么调用,PHP连接MySQL数据库的连接函数mysql_connect的第三个参数是( )。...
  16. 阿里巴巴DevOps实践手册 附下载链接
  17. Java Selenium防止被网站检测
  18. 小说作者推荐:渡山山合集
  19. springboot+easyexcel实现固定表头+动态表头的数据导出
  20. Briefings in Bioinformatics2021 | 从头药物设计的深度生成模型的综合性评估

热门文章

  1. LeetCode House Robber II(动态规划)
  2. LeetCode Maximum Depth of Binary Tree
  3. 网络编程学习笔记(getsockopt和setsockopt函数)
  4. Button的使用(三):处理点击事件
  5. Activity的用法(一):Notification Activity
  6. rest-framework 版本控制
  7. Analysis of the Clustering Properties of the Hilbert Space-Filling Curve 论文笔记
  8. 看了毁你三观的PCB设计理论 高速PCB外层还要不要覆铜了
  9. 获取当前应用程序的文件名
  10. 在myeclipse当中使用正则表达式去除单行注释