成都网站优化最低价,湖州网站建设公司哪家好,微网站的搭建,h5类作品是什么意思让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止#xff0c;如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法#xff0c;以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异… 让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异步分为了同步和异步两种构建方法//没有返回值的同步中间件构建器
public interface IPipelineBuilderTContext
{IPipelineBuilderTContext Use(FuncActionTContext, ActionTContext middleware);ActionTContext Build();
}
// 异步中间件构建器
public interface IAsyncPipelineBuilderTContext
{IAsyncPipelineBuilderTContext Use(FuncFuncTContext, Task, FuncTContext, Task middleware);FuncTContext, Task Build();
}
为了方便使用定义一下扩展方法使得可以像 asp.net core 中 app.Use(FunHttpContext,FuncTask,Task) 一样比较方便的使用扩展方法定义如下public static IPipelineBuilderTContext UseTContext(this IPipelineBuilderTContext builder, ActionTContext, Action action)
{return builder.Use(next context {action(context, () next(context));});
}
public static IAsyncPipelineBuilderTContext UseTContext(this IAsyncPipelineBuilderTContext builder, FuncTContext, FuncTask, Task func)
{return builder.Use(next context {return func(context, () next(context));});
}
为了方便创建对应的 PipelineBuilder 这里定义了两个方法使用 Create 方法就可以创建一个 IPipelineBuilder 使用 CreateAsync 就可以创建一个 IAsyncPipelineBuilderpublic class PipelineBuilder
{public static IPipelineBuilderTContext CreateTContext(ActionTContext completeAction){return new PipelineBuilderTContext(completeAction);}public static IAsyncPipelineBuilderTContext CreateAsyncTContext(FuncTContext, Task completeFunc){return new AsyncPipelineBuilderTContext(completeFunc);}
}
使用示例来看一个使用示例这里的示例修改自设计模式里的责任链模式的一个示例废话不说来看代码这是一个请假的示例不同的请假时间交由不同的审批主管进行审批最后模拟了从请假1小时到请假8小时的申请处理情况private class RequestContext
{public string RequesterName { get; set; }public int Hour { get; set; }
}
public static void Test()
{var requestContext new RequestContext(){RequesterName Kangkang,Hour 12,};var builder PipelineBuilder.CreateRequestContext(context {Console.WriteLine(${context.RequesterName} {context.Hour}h apply failed);}).Use((context, next) {if (context.Hour 2){Console.WriteLine(pass 1);}else{next();}}).Use((context, next) {if (context.Hour 4){Console.WriteLine(pass 2);}else{next();}}).Use((context, next) {if (context.Hour 6){Console.WriteLine(pass 3);}else{next();}});var requestPipeline builder.Build();foreach (var i in Enumerable.Range(1, 8)){Console.WriteLine();Console.WriteLine($--------- h:{i} apply Pipeline------------------);requestContext.Hour i;requestPipeline.Invoke(requestContext);Console.WriteLine(----------------------------);Console.WriteLine();}
}
public static async Task AsyncPipelineBuilderTest()
{var requestContext new RequestContext(){RequesterName Michael,Hour 12,};var builder PipelineBuilder.CreateAsyncRequestContext(context {Console.WriteLine(${context.RequesterName} {context.Hour}h apply failed);return Task.CompletedTask;}).Use(async (context, next) {if (context.Hour 2){Console.WriteLine(pass 1);}else{await next();}}).Use(async (context, next) {if (context.Hour 4){Console.WriteLine(pass 2);}else{await next();}}).Use(async (context, next) {if (context.Hour 6){Console.WriteLine(pass 3);}else{await next();}});var requestPipeline builder.Build();foreach (var i in Enumerable.Range(1, 8)){Console.WriteLine($--------- h:{i} apply AsyncPipeline------------------);requestContext.Hour i;await requestPipeline.Invoke(requestContext);Console.WriteLine(----------------------------);}
}
运行效果实现代码internal class PipelineBuilderTContext : IPipelineBuilderTContext
{private readonly ActionTContext _completeFunc;private readonly IListFuncActionTContext, ActionTContext _pipelines new ListFuncActionTContext, ActionTContext();public PipelineBuilder(ActionTContext completeFunc){_completeFunc completeFunc;}public IPipelineBuilderTContext Use(FuncActionTContext, ActionTContext middleware){_pipelines.Add(middleware);return this;}public ActionTContext Build(){var request _completeFunc;foreach (var pipeline in _pipelines.Reverse()){request pipeline(request);}return request;}
}
internal class AsyncPipelineBuilderTContext : IAsyncPipelineBuilderTContext
{private readonly FuncTContext, Task _completeFunc;private readonly IListFuncFuncTContext, Task, FuncTContext, Task _pipelines new ListFuncFuncTContext, Task, FuncTContext, Task();public AsyncPipelineBuilder(FuncTContext, Task completeFunc){_completeFunc completeFunc;}public IAsyncPipelineBuilderTContext Use(FuncFuncTContext, Task, FuncTContext, Task middleware){_pipelines.Add(middleware);return this;}public FuncTContext, Task Build(){var request _completeFunc;foreach (var pipeline in _pipelines.Reverse()){request pipeline(request);}return request;}
}
Referencehttps://github.com/WeihanLi/WeihanLi.Common/blob/dev/samples/DotNetCoreSample/PipelineTest.cshttps://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Helpers/Pipelines/PipelineBuilder.cshttps://github.com/dotnet/aspnetcore/blob/master/src/Http/Http/src/Builder/ApplicationBuilder.cs