ASP.NET Core 中基於工廠的中介軟體啟用
阿新 • • 發佈:2020-11-14
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)。