我們知道在ASP.NET MVC中,在Action方法上應用ActionFilter過濾法時,它的執行流程如下圖:

這個功能看起來很一般麽,可是實現功能的代碼吊炸天(嘿嘿,要班門弄斧了,大神繞行吧!),卡忙北鼻...
由於在ASP.NET MVC中其功能涉及的代碼太多,看起來太亂,下面就通過一個例子重點來介紹下這段吊爆的代碼!
例子的環境是這樣的:
1、有這么一個接口IFilterFunction,其中定義了兩個方法!
public interface IFilterFunction
{
void Before();
void After();
}
2、一個方法!
public string ActionMethed()
{
Console.WriteLine("Action方法內容");
return "Action";
}
需求來了,為了在執行ActionMethod方法的前后進行一些操作,要求實現功能:先執行所有實現了IFilterFunction接口的所有類的Before方法,再執行ActionMethed方法,然后再執行所有實現了IFilterFunction接口的所有類的After方法!(目的是在執行ActionMethod方法的前后進行一些操作)
對於這么一個需求,首先想到可以這么實現:
小吊實現:
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;
}
雖然說可以實現,但是這么做有點太小兒科了,說好的吊爆呢?
來咯......
大吊實現:
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過濾器的執行。即:利用累加器來包裝委托!
朋友,你能寫出這樣的代碼嗎? 實例源碼下載
