C# 链式调用,模仿.Net Core中间件写法

C# 链式调用,模仿.Net Core中间件写法

定义 MiddlewareDelegate

public delegate Task MiddlewareDelegate(Func<Task> next, PipelineContext context);

定义上下文类

public class PipelineContext
{
    public Dictionary<string, object> Items { get; } = new();

    public void Set(string key, object value) => Items[key] = value;

    public T Get<T>(string key) => Items.TryGetValue(key, out var value) ? (T)value : default;
}

Pipeline 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public class Pipeline
{
    private readonly List<MiddlewareDelegate> _middlewares = new();

    public Pipeline Use(MiddlewareDelegate middleware)
    {
        _middlewares.Add(middleware);
        return this;
    }

    public Func<PipelineContext, Task> Build()
    {
        Func<Task> finalTask = () =>
        {
            Console.WriteLine("Pipeline End: Final Task");
            return Task.CompletedTask;
        };

        Func<PipelineContext, Task> pipeline = context => finalTask();

        foreach (var middleware in _middlewares.AsReadOnly().Reverse())
        {
            var next = pipeline;
            pipeline = context => middleware(() => next(context), context);
        }

        return pipeline;
    }
}

使用

class Program
{
    static async Task Main(string[] args)
    {
        var pipeline = new Pipeline();

        pipeline.Use(async (next, context) =>
        {
            Console.WriteLine("Middleware 1: Before");
            context.Set("Key1", "Value1"); // 设置上下文数据
            await next();
            Console.WriteLine("Middleware 1: After");
        });

        pipeline.Use(async (next, context) =>
        {
            Console.WriteLine("Middleware 2: Before");
            var key1Value = context.Get<string>("Key1"); // 读取上下文数据
            Console.WriteLine($"Key1 Value: {key1Value}");
            context.Set("Key2", "Value2");
            await next();
            Console.WriteLine("Middleware 2: After");
        });

        pipeline.Use((next, context) =>
        {
            Console.WriteLine("Middleware 3: Endpoint");
            var key2Value = context.Get<string>("Key2");
            Console.WriteLine($"Key2 Value: {key2Value}");
            return Task.CompletedTask;
        });

        var executablePipeline = pipeline.Build();

        // 创建上下文并运行管道
        var context = new PipelineContext();
        await executablePipeline(context);
    }
}

输出

Middleware 1: Before
Middleware 2: Before
Key1 Value: Value1
Middleware 3: Endpoint
Key2 Value: Value2
Middleware 2: After
Middleware 1: After
Pipeline End: Final Task

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值