码迷,mamicode.com
首页 > 其他好文 > 详细

简单的管道模拟

时间:2020-02-13 09:24:25      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:ram   rgs   ddl   fir   png   src   管道   ted   linq   

简单的管道模拟

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using static ConsolePipeline.Program;
using System.Linq;

namespace ConsolePipeline
{
    public class Program
    {
        public delegate Task RequestDelegate(Httpcontext httpcontext);
        static void Main(string[] args)
        {
            ApplicationBuilder app = new ApplicationBuilder();
            app.Use(async (context, next) =>
            {
                Console.WriteLine("第一次 开始。。。");
                await next();
                Console.WriteLine("第一次 结束。。。");
            });
            app.Use(async (context, next) =>
            {
                Console.WriteLine("第二次 开始。。。");
                await next();
                Console.WriteLine("第二次 结束。。。");
            });
            var firstmiddleware = app.Build();
            firstmiddleware(new Httpcontext());
            Console.WriteLine("Hello World!");
        }
    }

    public class Httpcontext { }

    public class ApplicationBuilder
    {
        //中间的委托,不是中间件
        public static readonly IList<Func<RequestDelegate, RequestDelegate>> _components = new List<Func<RequestDelegate, RequestDelegate>>();

        //原生Use
        public ApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)
        {
            _components.Add(middleware);
            return this;
        }

        // 扩展Use
        public ApplicationBuilder Use(Func<Httpcontext, Func<Task>, Task> middleware)
        {
            return Use(next =>
            {
                return context =>
                {
                    Task SimpleNext() => next(context);
                    return middleware(context, SimpleNext);
                };
            });
        }

        public RequestDelegate Build()
        {
            RequestDelegate app = next =>
            {
                Console.WriteLine("中间中间件。。。");
                return Task.CompletedTask;
            };

            foreach (var component in _components.Reverse())
            {
                app = component(app);
            }
            return app;
        }
    }
}

运行效果:

技术图片

 

简单的管道模拟

标签:ram   rgs   ddl   fir   png   src   管道   ted   linq   

原文地址:https://www.cnblogs.com/1175429393wljblog/p/12302074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!