c# Middleware impl

using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pactera.Bpm.TestProject.MiddlewareTest
{
    [TestFixture]
    public class TestMiddleware
    {
        [Test]
        public void TestMiddlewareImpl()
        {
            var context = new HttpContext();
            var builder = new AppBuilder();
            builder.Use(next =>
            {
                return (ctx) =>
                {
                    ctx.AddMessage("m1 invoke");
                    next(ctx);
                };
            });
            builder.Use(next =>
            {
                return (ctx) =>
                {
                    ctx.AddMessage("m2 invoke");
                    next(ctx);
                };
            });

            //app.Use((ctx, next) =>
            //{
            //    Console.WriteLine("m3 message:{0}", ctx.Message);
            //    ctx.Message = "Change by m3";
            //    next(ctx);
            //});

            var app = builder.Build();
            app(context);

            context.DisplayMessage();
        }
    }

    public class HttpContext
    {
        private IList<string> _message = new List<string>();
        public void AddMessage(string message)
        {
            _message.Add(message);
        }

        public void DisplayMessage()
        {
            foreach (var msg in _message)
            {
                Console.WriteLine(msg);
            }
        }
    }

    public delegate void HttpRequestTask(HttpContext context);

    public class AppBuilder
    {
        private IList<Func<HttpRequestTask, HttpRequestTask>> middlewares = new List<Func<HttpRequestTask, HttpRequestTask>>();

        public void Use(Func<HttpRequestTask, HttpRequestTask> middleware)
        {
            middlewares.Add(middleware);
        }

        //public void Use(Action<CustomeHttpContext, HttpTask> middleware)
        //{
        //    var context = new CustomeHttpContext() { Message = "inner context" };
            

        //    middlewares.Add((ctx) =>
        //    {
        //        middleware(context, HandleRequest);
        //        return HandleRequest;
        //    });

        //}

        public void Run(Action<HttpContext> middleware)
        {
            //var context = new HttpContext() { Message = "inner context" };
            //middleware(context);
        }

        public HttpRequestTask Build()
        {
            HttpRequestTask next = (ctx) =>
            {
                ctx.AddMessage("Start app 404");
            };

            var newmiddlewares = middlewares.Reverse<Func<HttpRequestTask, HttpRequestTask>>();

            foreach (var middleware in newmiddlewares)
            {
                next = middleware(next);
            }

            return next;
        }
    }
}

原文地址:https://www.cnblogs.com/byxxw/p/9579596.html