伟大的无产阶级Willaim曾说过:"无论你觉得自己多么的了不起,也永远有人比你更强"。对,我说过!我就是william。

今天想记录一下在项目中遇到的一个比较有意思的东西,异常拦截器(也不能完全说只是异常拦截,准确的说应该叫方法拦截),那有的人可能会说,异常拦截器不就是用Try……Catch就好了吗?没错,Try……Catch是能拦截到异常。如果只是简单拦截下,这种方法简单可行。但是我们如果扩展下,所有的异常都要统一处理,如果你是架构师,你的团队需要你提供一个公共的异常拦截处理组件,你会怎么处理。

其实在做这个demo之前,我也是想了很多种处理方式,例如在方法前加特性头使用AOP的方式,这种看的比较高大上,也需要配置大量config文件,比较复杂。也不适合我的项目现状(实则是懒,由于框架已经基本形成,采用这种方式需要改动大量的已经完成的框架代码,而且时间紧迫),所以放弃了。开始需求给到我时,一时之间无从下手,在网上搜罗很多处理方式,但大多数都是采用AOP加特性头。当然我也这个demo也是借助于博客园中各位大神的经验。站在巨人的肩膀上,我可以看得更远!谢谢博客园的各位博主!矫情的话不多说了直接开始我的代码之旅。

首先我们看看效果图,俗话说没图说个J8,有图有文的才是好博文。

(这是一张执行正常的截图)

(这是一张执行带有异常的截图)

(demo的结构图,只是简单的模拟)

解释一下工程结构图每隔类文件的作用。其中红框标记的是本次的重要组件,你的拦截器中需要用他中间的接口。Castle.Core我们可以在NuGet中进行安装。

1.【MyIntercept.cs

这个文件就是自定义的拦截器。代码很简单。

  1. using Castle.DynamicProxy; //必须的
  2.  
  3. public class MyIntercept : IInterceptor //需要实现这个接口(翻译拦截)
  4. {
  5. public void Intercept(IInvocation invocation)
  6. {
  7. Console.WriteLine("【进入拦截器】");
  8. MethodInfo method = invocation.GetConcreteMethod();//得到被拦截的方法
  9. var parameter=invocation.Arguments[].ToString();//获取被拦截的方法参数
  10. if (!invocation.MethodInvocationTarget.IsAbstract)
  11. {
  12. Console.WriteLine("【被拦截的方法执行前】"+method.Name+"的参数"+ parameter);
  13.  
  14. try
  15. {
  16. invocation.Proceed();
  17. }
  18. catch (Exception ex)
  19. {
  20.  
  21. Console.WriteLine("【拦截到异常】"+ex.Message);
  22. }
  23. Console.WriteLine("【被拦截的方法执结果】"+invocation.ReturnValue);
  24.  
  25. }
  26. Console.WriteLine("【被拦截的方法执完毕】");
  27. }
  28. }

2.ITestIntercept.cs

定义一个接口,接口中定义需要实现的方法,也就是需要被拦截的方法

  1. public interface ITestIntercept
  2. {
  3. string Test(string p);
  4. }

3.【TestIntercept.cs

实现上面的接口

  1. public class TestIntercept : ITestIntercept
  2. {
  3. public string Test(string p)
  4. {
  5. throw new Exception("异常了"); //演示抛出异常,拦截器是否能捕捉到异常信息
  6. //return p;
  7. }
  8. }

基本的异常拦截准备工作已经完毕,我们看看如何使用拦截器对方法进行拦截。

  1. using Castle.DynamicProxy; //必须的
  2. class Program
  3. {
  4. static void Main(string[] args)
  5. {
  6. MyIntercept myIntercept = new MyIntercept();//实例化拦截器
  7. ProxyGenerator proxy = new ProxyGenerator(); //实例化代理
  8. ITestIntercept intercept = proxy.CreateInterfaceProxyWithTarget<ITestIntercept>(new TestIntercept(),myIntercept);
  9. intercept.Test("william");
  10. Console.ReadLine();
  11. }
  12. }

好了,一个简单的方法拦截demo完成,他可以应用到很多场景,比如:权限验证,异常统计等等。

遗留问题,有兴趣的同学可以试试:

1.如果接口中有多个方法,拦截器会全部拦截吗?

2.ProxyGenerator,我才用的是CreateInterfaceProxyWithTarget对接口和实现类进行mapping。是否还有其他的方式进行mapping工作,例如配置文件?

3.本次demo中采用的是实现接口的方式对方法进行拦截,如果不用接口,拦截器是否会起作用。因为我发现在ProxyGenerator中有个CreateClassProxyWithTarget()函数。大家可以试试。

.NET 简易方法拦截器的更多相关文章

  1. Node.js与Sails~方法拦截器policies

    回到目录 policies sails的方法拦截器类似于.net mvc里的Filter,即它可以作用在controller的action上,在服务器响应指定action之前,对这个action进行拦 ...

  2. struts2 参数注入 方法拦截器

    web.xml: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=" ...

  3. Struts2之类范围拦截器和方法拦截器

    1.Struts2拦截器的体系结构 Struts2拦截器最大的特点是其透明性,即用户感觉不到它的存在,但我们在使用Struts2框架时,拦截器时时刻刻都在帮助我们处理很多事情. 包括: 文件上传 表单 ...

  4. MethodFilterInterceptor(方法拦截器)配置excludeMethors

    由于该类有setExcludeMethods方法,因此在xml中可以配置一个excludeMethods参数 刚开始老是拦截不成功,tomcat显示这个参数没找到,后来终于找到错误:不应该在拦截器栈中 ...

  5. struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解

    http://www.cnblogs.com/langtianya/archive/2013/04/10/3012205.html

  6. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  7. struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证

    struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  8. 关于springmvc 方法注解拦截器的解决方案,多用于方法的鉴权

    最近在用SpringMvc写项目的时候,遇到一个问题,就是方法的鉴权问题,这个问题弄了一天了终于解决了,下面看下解决方法 项目需求:需要鉴权的地方,我只需要打个标签即可,比如只有用户登录才可以进行的操 ...

  9. struts2 全局拦截器,显示请求方法和參数

    后台系统中应该须要一个功能那就是将每一个请求的url地址和请求的參数log出来,方便系统调试和bug追踪,使用struts2时能够使用struts2的全局拦截器实现此功能: import java.u ...

随机推荐

  1. 百度Cafe原理--Android自动化测试学习历程

    主要讲解内容及笔记: 一.Cafe原理 Cafe是一款自动化测试框架,解决问题:跨进程测试.快速深度测试 官网:http://baiduqa.github.io/Cafe/ Cafe provides ...

  2. swift UITextfield 添加点击方法 - 简单实现

    1. 真正在任何系统上都有效的方法 1./// 城市选择 private lazy var cityTextfield:UITextField = { let tf = UITextField() t ...

  3. 启动apache时,出现httpd: Could not reliably determine the server\'s fully qualified domain name, using 127.0.0.1 for ServerName

    1.通过vi打开apache的配置文件httpd.conf > vi /data/apache/conf/httpd.conf 2.找到#ServerName www.example.com:8 ...

  4. Spring的2.5版本中提供了一种:p名称空间的注入(了解)

    1. 步骤一:需要先引入 p 名称空间 * 在schema的名称空间中加入该行:xmlns:p="http://www.springframework.org/schema/p"( ...

  5. DB2数据库常用命令数据库学习

    DB2数据库常用命令数据库学习你可以用 get snapshot for locks on XXX 看是那个表锁了,再从相关的操作去查原因吧 db2pd -d 库名 -locks和db2pd -d 库 ...

  6. 详解JMeter正则表达式

    详解JMeter正则表达式(1) 1.概览 JMeter中包含范本匹配软件Apache Jakarta ORO .在Jakarta网站上有一些关于它的文档,例如a summary of the pat ...

  7. TASK 的使用

    http://www.tuicool.com/articles/IveiQbQ

  8. sql删除重复记录

    DELETE E FROM t E where E.id> ( SELECT MIN(X.id) FROM t X WHERE X.name = E.name );

  9. Spring AOP配置

    相关概念有点拗口,我这里简单总结一个,切面,决定做什么,写处理逻辑,比如打日志.切入点,决定在哪些方里拦截,一般填正则表达式查询. 通知,就是连接切面和切入点的桥梁. 其中遇到了配置好,启动服务器没报 ...

  10. for() 和$.each()的用法区别

    一.对于数组 var arr=['姚明','易建联','张继科']; $.each(arr,function(index,value){ document.write(index+"=&qu ...