累加器配上委托也可以很吊


我們知道在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方法");
    }
}
實現IFilterFunction接口的類
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方法");
    }
}
實現接口IFilterFunction的類
        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過濾器的執行。即:利用累加器來包裝委托!

朋友,你能寫出這樣的代碼嗎? 實例源碼下載

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM