咱们知道在ASP.NET MVC中,在Action方法上应用ActionFilter过滤法时,它的执行流程以下图:ide
这个功能看起来很通常麽,但是实现功能的代码吊炸天(嘿嘿,要班门弄斧了,大神绕行吧!),卡忙北鼻...spa
因为在ASP.NET MVC中其功能涉及的代码太多,看起来太乱,下面就经过一个例子重点来介绍下这段吊爆的代码!3d
例子的环境是这样的:code
一、有这么一个接口IFilterFunction,其中定义了两个方法!blog
public interface IFilterFunction { void Before(); void After(); }
二、一个方法!接口
public string ActionMethed() { Console.WriteLine("Action方法内容"); return "Action"; }
需求来了,为了在执行ActionMethod方法的先后进行一些操做,要求实现功能:先执行全部实现了IFilterFunction接口的全部类的Before方法,再执行ActionMethed方法,而后再执行全部实现了IFilterFunction接口的全部类的After方法!(目的是在执行ActionMethod方法的先后进行一些操做)get
对于这么一个需求,首先想到能够这么实现:源码
小吊实现:string
public class FilterOne : IFilterFunction { public void Before() { Console.WriteLine("执行FilterOne的Before方法"); } public void After() { Console.WriteLine("执行FilterOne的After方法"); } } public class FilterTwo : IFilterFunction { public void Before() { Console.WriteLine("执行FilterTwo的Before方法"); } public void After() { Console.WriteLine("执行FilterTwo的BAfter方法"); } } public class FilterThree : IFilterFunction { public void Before() { Console.WriteLine("执行FilterThree的Before方法"); } public void After() { Console.WriteLine("执行FilterThree的After方法"); } }
public string Start() { FilterOne filterOne = new FilterOne(); FilterTwo filterTwo = new FilterTwo(); FilterThree filterThree = new FilterThree(); filterThree.Before(); filterTwo.Before(); filterOne.Before(); string str = ActionMethed(); filterOne.After(); filterTwo.After(); filterThree.After(); return str; }
虽说能够实现,可是这么作有点过小儿科了,说好的吊爆呢?
来咯......it
大吊实现:
public class FilterOne : IFilterFunction { public void Before() { Console.WriteLine("执行FilterOne的Before方法"); } public void After() { Console.WriteLine("执行FilterOne的After方法"); } } public class FilterTwo : IFilterFunction { public void Before() { Console.WriteLine("执行FilterTwo的Before方法"); } public void After() { Console.WriteLine("执行FilterTwo的BAfter方法"); } } public class FilterThree : IFilterFunction { public void Before() { Console.WriteLine("执行FilterThree的Before方法"); } public void After() { Console.WriteLine("执行FilterThree的After方法"); } }
public string Start() { Func<string> continuation = () => ActionMethed(); List<IFilterFunction> lists = new List<IFilterFunction>(); lists.Add(new FilterOne()); lists.Add(new FilterTwo()); lists.Add(new FilterThree()); //就是它 Func<string> p = lists.Aggregate(continuation, (newcontinuation, filter) => () => Do(newcontinuation, filter)); return p(); } public string Do(Func<string> continuation, IFilterFunction filter) { filter.Before(); string str = continuation(); filter.After(); return str; }
执行结果为:
没错,就是这么牛逼,利用累加器来一层一层的包装委托,以后执行委托,再一层一层的去执行。其过程如图:
ASP.NET MVC也就是使用这种方式来完成对Action方法和ActionFilter过滤器的执行。即:利用累加器来包装委托!
朋友,你能写出这样的代码吗? 实例源码下载