zoukankan      html  css  js  c++  java
  • DOTNET 中间件 (自定义) 类似 asp.net core 中的中间件

    直接上代码比较好

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace src
    {
        public class Program
        {
            public static async Task Main(string[] args)
            {
                IApplicationBuilder app = new ApplicationBuilder();
    
                app.Use(async (context, next) =>
                {
                    context.SeyHello();
                    await next.Invoke();
                });
    
                app.Use(async (context, next) =>
                {
                    context.Sey("你好");
                    await next.Invoke();
                });
    
                var _task = app.Build();
    
                var context = new NetworkContext();
                var context1 = new NetworkContext();
    
                await _task(context);
    
                await _task(context1);
            }
        }
    
        public class ApplicationBuilder : IApplicationBuilder
        {
            private readonly IList<Func<NetworkRequestDelegate, NetworkRequestDelegate>> _middlewares = new List<Func<NetworkRequestDelegate, NetworkRequestDelegate>>();
            public NetworkRequestDelegate Build()
            {
                NetworkRequestDelegate app = context =>
                {
                    return Task.CompletedTask;
                };
    
                for (var c = _middlewares.Count - 1; c >= 0; c--)
                {
                    app = _middlewares[c](app);
                }
    
                return app;
            }
    
            public IApplicationBuilder New()
            {
                return new ApplicationBuilder();
            }
    
            public IApplicationBuilder Use(Func<NetworkRequestDelegate, NetworkRequestDelegate> middleware)
            {
                _middlewares.Add(middleware);
                return this;
            }
        }
    
        public interface IApplicationBuilder
        {
            IApplicationBuilder Use(Func<NetworkRequestDelegate, NetworkRequestDelegate> middleware);
    
            NetworkRequestDelegate Build();
    
            IApplicationBuilder New();
    
        }
    
        public class NetworkContext
        {
            private Guid _id;
    
            public NetworkContext()
            {
                _id = Guid.NewGuid();
            }
    
            public void SeyHello()
            {
                Console.WriteLine($"{_id} say hello.");
            }
    
            public void Sey(string msg)
            {
                Console.WriteLine($"{_id} say {msg}");
            }
        }
    
        public delegate Task NetworkRequestDelegate(NetworkContext context);
    
        public static class UseExtensions
        {
            public static IApplicationBuilder Use(this IApplicationBuilder app, Func<NetworkContext, Func<Task>, Task> middleware)
            {
                return app.Use(next =>
                {
                    return context =>
                    {
                        Func<Task> simpleNext = () => next(context);
                        return middleware(context, simpleNext);
                    };
                });
            }
    
            public static IApplicationBuilder Use(this IApplicationBuilder app, Func<NetworkContext, NetworkRequestDelegate, Task> middleware)
            {
                return app.Use(next => context => middleware(context, next));
            }
    
        }
    
        public static class RunExtensions
        {
            public static void Run(this IApplicationBuilder app, NetworkRequestDelegate handler)
            {
                if (app == null)
                {
                    throw new ArgumentNullException(nameof(app));
                }
    
                if (handler == null)
                {
                    throw new ArgumentNullException(nameof(handler));
                }
    
                app.Use(_ => handler);
            }
        }
    }
    
    
  • 相关阅读:
    JS方法集
    IOC 在Mvc中的使用
    ExtJS4 便捷三层开发模式
    Net Framework中的提供的常用委托类型
    作用域、作用域链理解
    Swing中弹出对话框的几种方式(转)
    程序员的价值观——经验是无价之宝(转)
    透过浏览器看HTTP缓存(转)
    模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转)
    开发小结(转)
  • 原文地址:https://www.cnblogs.com/microestc/p/15341806.html
Copyright © 2011-2022 走看看