詳解ASP.NET Core 中基于工廠的中間件激活的實現(xiàn)方法
IMiddlewareFactory/IMiddleware是中間件激活的擴展點。
UseMiddleware擴展方法檢查中間件的已注冊類型是否實現(xiàn)IMiddleware。如果是,則使用在容器中注冊的IMiddlewareFactory實例來解析IMiddleware實現(xiàn),而不使用基于約定的中間件激活邏輯。中間件在應用的服務容器中注冊為作用域或瞬態(tài)服務。
優(yōu)點:
- 按客戶端請求(作用域服務的注入)激活
- 讓中間件強類型化
IMiddleware按客戶端請求(連接)激活,因此作用域服務可以注入到中間件的構(gòu)造函數(shù)中。
IMiddleware
IMiddleware定義應用的請求管道的中間件。InvokeAsync(HttpContext, RequestDelegate)方法處理請求,并返回代表中間件執(zhí)行的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);
}
}
程序會為中間件創(chuàng)建擴展:
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的內(nèi)置容器中:
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提供中間件的創(chuàng)建方法。中間件工廠實現(xiàn)在容器中注冊為作用域服務。
可在Microsoft.AspNetCore.Http包中找到默認的IMiddlewareFactory實現(xiàn)(即MiddlewareFactory)。
到此這篇關于ASP.NET Core 中基于工廠的中間件激活詳解的文章就介紹到這了,更多相關ASP.NET Core中間件激活內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
"PageMethods未定義"或"對象不支持此屬性或方法"解決方法分享
PageMethods未定義或?qū)ο蟛恢С执藢傩曰蚍椒ń鉀Q方法,需要的朋友可以參考下。2010-12-12
使用Blazor框架實現(xiàn)在前端瀏覽器中導入和導出Excel
Blazor?是一個相對較新的框架,用于構(gòu)建具有?.NET?強大功能的交互式客戶端?Web?UI,本文主要介紹了如何在?Blazor?應用程序中實現(xiàn)?SpreadJS?利用?.NET?的強大功能完成瀏覽器端的?Excel?導入導出,需要的可以參考一下2023-05-05
ajax.net +jquery 無刷新三級聯(lián)動的實例代碼
ajax.net +jquery 無刷新三級聯(lián)動的實例代碼,需要的朋友可以參考一下2013-05-05
Asp.Net?Core7?preview4限流中間件新特性詳解
這篇文章主要為大家介紹了Asp.Net?Core7?preview4限流中間件的新特性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
.Net Core中間件之靜態(tài)文件(StaticFiles)示例詳解
這篇文章主要給大家介紹了關于.Net Core中間件之靜態(tài)文件(StaticFiles)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧2018-09-09
.NET異步編程總結(jié)----四種實現(xiàn)模式代碼總結(jié)
本篇文章主要介紹了.NET異步編程總結(jié)----四種實現(xiàn)模式,詳細的介紹了每種方法的實現(xiàn)和實例,具有一定的參考價值,有興趣的可以了解一下。2016-12-12

