详解ASP.NET Core 中基于工厂的中间件激活的实现方法
IMiddlewareFactory/IMiddleware是中间件激活的扩展点。
UseMiddleware扩展方法检查中间件的已注册类型是否实现IMiddleware。如果是,则使用在容器中注册的IMiddlewareFactory实例来解析IMiddleware实现,而不使用基于约定的中间件激活逻辑。中间件在应用的服务容器中注册为作用域或瞬态服务。
优点:
- 按客户端请求(作用域服务的注入)激活
- 让中间件强类型化
IMiddleware按客户端请求(连接)激活,因此作用域服务可以注入到中间件的构造函数中。
IMiddleware
IMiddleware定义应用的请求管道的中间件。InvokeAsync(HttpContext,RequestDelegate)方法处理请求,并返回代表中间件执行的Task。
使用约定激活的中间件:
publicclassConventionalMiddleware { privatereadonlyRequestDelegate_next; publicConventionalMiddleware(RequestDelegatenext) { _next=next; } publicasyncTaskInvokeAsync(HttpContextcontext,AppDbContextdb) { varkeyValue=context.Request.Query["key"]; if(!string.IsNullOrWhiteSpace(keyValue)) { db.Add(newRequest() { DT=DateTime.UtcNow, MiddlewareActivation="ConventionalMiddleware", Value=keyValue }); awaitdb.SaveChangesAsync(); } await_next(context); } }
使用MiddlewareFactory激活的中间件:
publicclassFactoryActivatedMiddleware:IMiddleware { privatereadonlyAppDbContext_db; publicFactoryActivatedMiddleware(AppDbContextdb) { _db=db; } publicasyncTaskInvokeAsync(HttpContextcontext,RequestDelegatenext) { varkeyValue=context.Request.Query["key"]; if(!string.IsNullOrWhiteSpace(keyValue)) { _db.Add(newRequest() { DT=DateTime.UtcNow, MiddlewareActivation="FactoryActivatedMiddleware", Value=keyValue }); await_db.SaveChangesAsync(); } awaitnext(context); } }
程序会为中间件创建扩展:
publicstaticclassMiddlewareExtensions { publicstaticIApplicationBuilderUseConventionalMiddleware( thisIApplicationBuilderbuilder) { returnbuilder.UseMiddleware(); } publicstaticIApplicationBuilderUseFactoryActivatedMiddleware( thisIApplicationBuilderbuilder) { returnbuilder.UseMiddleware (); } }
无法通过UseMiddleware将对象传递给工厂激活的中间件:
publicstaticIApplicationBuilderUseFactoryActivatedMiddleware( thisIApplicationBuilderbuilder,booloption) { //Passing'option'asanargumentthrowsaNotSupportedExceptionatruntime. returnbuilder.UseMiddleware(option); }
将工厂激活的中间件添加到Startup.ConfigureServices的内置容器中:
publicvoidConfigureServices(IServiceCollectionservices) { services.AddDbContext(options=> options.UseInMemoryDatabase("InMemoryDb")); services.AddTransient (); services.AddRazorPages(); }
两个中间件均在Startup.Configure的请求处理管道中注册:
publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv) { if(env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseConventionalMiddleware(); app.UseFactoryActivatedMiddleware(); app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints=> { endpoints.MapRazorPages(); }); }
IMiddlewareFactory
IMiddlewareFactory提供中间件的创建方法。中间件工厂实现在容器中注册为作用域服务。
可在Microsoft.AspNetCore.Http包中找到默认的IMiddlewareFactory实现(即MiddlewareFactory)。
到此这篇关于ASP.NETCore中基于工厂的中间件激活详解的文章就介绍到这了,更多相关ASP.NETCore中间件激活内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!