详解ASP.NET Core 中基于工场的中间件激活的实现要领
IMiddlewareFactory/IMiddleware是中间件激活的扩展点。 UseMiddleware扩展要领搜查中间件的已注册范例是否实现IMiddleware。假如是,则行使在容器中注册的IMiddlewareFactory实例来理会IMiddleware实现,而不行使基于约定的中间件激活逻辑。中间件在应用的处事容器中注册为浸染域或瞬态处事。 利益: 按客户端哀求(浸染域处事的注入)激活 让中间件强范例化 IMiddleware按客户端哀求(毗连)激活,因此浸染域处事可以注入到中间件的结构函数中。 IMiddleware IMiddleware界说应用的哀求管道的中间件。InvokeAsync(HttpContext, RequestDelegate)要领处理赏罚哀求,并返回代表中间件执行的Task。 行使约定激活的中间件: public class ConventionalMiddleware { private readonly RequestDelegate _next; public ConventionalMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context, AppDbContext db) { var keyValue = context.Request.Query["key"]; if (!string.IsNullOrWhiteSpace(keyValue)) { db.Add(new Request() { DT = DateTime.UtcNow, MiddlewareActivation = "ConventionalMiddleware", Value = keyValue }); await db.SaveChangesAsync(); } await _next(context); } } 行使MiddlewareFactory激活的中间件: public class FactoryActivatedMiddleware : IMiddleware { private readonly AppDbContext _db; public FactoryActivatedMiddleware(AppDbContext db) { _db = db; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { var keyValue = context.Request.Query["key"]; if (!string.IsNullOrWhiteSpace(keyValue)) { _db.Add(new Request() { DT = DateTime.UtcNow, MiddlewareActivation = "FactoryActivatedMiddleware", Value = keyValue }); await _db.SaveChangesAsync(); } await next(context); } } 措施会为中间件建设扩展: public static class MiddlewareExtensions { public static IApplicationBuilder UseConventionalMiddleware( this IApplicationBuilder builder) { return builder.UseMiddleware<ConventionalMiddleware>(); } public static IApplicationBuilder UseFactoryActivatedMiddleware( this IApplicationBuilder builder) { return builder.UseMiddleware<FactoryActivatedMiddleware>(); } } 无法通过UseMiddleware将工具转达给工场激活的中间件: public static IApplicationBuilder UseFactoryActivatedMiddleware( this IApplicationBuilder builder, bool option) { // Passing 'option' as an argument throws a NotSupportedException at runtime. return builder.UseMiddleware<FactoryActivatedMiddleware>(option); } 将工场激活的中间件添加到Startup.ConfigureServices的内置容器中: public void ConfigureServices(IServiceCollection services) { services.AddDbContext<AppDbContext>(options => options.UseInMemoryDatabase("InMemoryDb")); services.AddTransient<FactoryActivatedMiddleware>(); services.AddRazorPages(); } 两此中间件均在Startup.Configure的哀求处理赏罚管道中注册: public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { 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.NET Core 中基于工场的中间件激活详解的文章就先容到这了,更多相干ASP.NET Core中间件激活内容请搜刮剧本之家早年的文章或继承赏识下面的相干文章但愿各人往后多多支持剧本之家! (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |