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

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

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

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

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

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

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

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

1.【MyIntercept.cs

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

 using Castle.DynamicProxy; //必须的

 public class MyIntercept : IInterceptor //需要实现这个接口(翻译拦截)
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("【进入拦截器】");
MethodInfo method = invocation.GetConcreteMethod();//得到被拦截的方法
var parameter=invocation.Arguments[].ToString();//获取被拦截的方法参数
if (!invocation.MethodInvocationTarget.IsAbstract)
{
Console.WriteLine("【被拦截的方法执行前】"+method.Name+"的参数"+ parameter); try
{
invocation.Proceed();
}
catch (Exception ex)
{ Console.WriteLine("【拦截到异常】"+ex.Message);
}
Console.WriteLine("【被拦截的方法执结果】"+invocation.ReturnValue); }
Console.WriteLine("【被拦截的方法执完毕】");
}
}

2.ITestIntercept.cs

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

 public interface ITestIntercept
{
string Test(string p);
}

3.【TestIntercept.cs

实现上面的接口

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

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

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

好了,一个简单的方法拦截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. chest

    chest - 必应词典 美[tʃest]英[tʃest] n.胸部:胸膛:有…胸的:胸部…的 网络胸围:箱子:胸腔 变形复数:chests:

  2. 非换行空白:non-breaking space

    一 维基百科(英文版)词条 In word processing and digital typesetting, a non-breaking space (" ") (also ...

  3. day10:vcp考试

    Q181. An administrator is deploying ESXi 6.x hosts using Auto Deploy and wants the image profile to ...

  4. 初学Hadoop之图解MapReduce与WordCount示例分析

    Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...

  5. ADF 入门帮助

    本文是由英文帮助翻译所得: 1>task flows “任务流 task flows”可以包括非可视化的组件,比如方法调用.“页片段 page fragment”可以运行在一个页面的某个局部区域 ...

  6. 【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造

    Semaphore 继承自WaitHandle. 信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量. //创建一个限制资源类 //资源数为5,开放资源数为2 //主线程自动占有3个资源 ...

  7. JTemplate学习(四)

    注释.自定方法.模板嵌套子模板.循环输出不同class <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "htt ...

  8. Asia Stock Exchanges[z]

    Asia Stock Exchanges July 7, 2009 This article is to summarise the trading rules of some Asia stocke ...

  9. Windows下误删资料的恢复

    只要三步,就能找回你删掉并清空回收站的东西 : 1.打开“运行”消息框,然后输入regedit (打开注册表) 2.依次展开:HEKEY——LOCAL——MACHIME/SOFTWARE/micros ...

  10. How to Set Up an Rsync Daemon on Your Linux Server

    Introduction This tutorial will take you through setting up an rsync daemon on your Linux server. Yo ...