中间件(2)
电脑版发表于:2022/2/10 10:19
前言
接着上一篇
开发中间件
基于约定的中间件开发
在 ASP.NET Core 官网上面提供了一个简单的例子,通过中间件来设置应用的区域信息,代码如下:
public void Configure(IApplicationBuilder app){ app.Use((context, next) => { var cultureQuery = context.Request.Query["culture"]; if (!string.IsNullOrWhiteSpace(cultureQuery)) { var culture = new CultureInfo(cultureQuery); CultureInfo.CurrentCulture = culture; CultureInfo.CurrentUICulture = culture; } // Call the next delegate/middleware in the pipeline return next(); }); app.Run(async (context) => { await context.Response.WriteAsync( $"Hello {CultureInfo.CurrentCulture.DisplayName}"); }); }
通过这段代码,我们可以通过QueryString的方式设置应用的区域信息。但是这样的代码怎样复用呢?注意,中间件一定要是可复用、方便复用的。我们来改造这段代码:
public class RequestCultureMiddleware{ private readonly RequestDelegate _next; public RequestCultureMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { //...... // Call the next delegate/middleware in the pipeline await _next(context); } }
这里定义一个委托,用于执行具体的业务逻辑,然后在Configure中调用这个委托:
app.UseMiddleware<RequestCultureMiddleware>();
这样还是不太方便,不像我们使用app.UseMvc()这么方便,那么我们来添加一个扩展方法,来实现更方便的复用:
public static class RequestCultureMiddlewareExtensions{ public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestCultureMiddleware>(); } }
然后我们就可以这样使用中间件了:
app.UseRequestCulture();
通过委托构造中间件,应用程序在运行时创建这个中间件,并将它添加到管道中。这里需要注意的是,中间件的创建是单例的,每个中间件在应用程序生命周期内只有一个实例。
原:ASP.NET Core 中间件基本用法 - 拓荒者-NET - 博客园 (cnblogs.com)