詳解ASP.NET Core 中基于工廠的中間件激活的實(shí)現(xiàn)方法
IMiddlewareFactory/IMiddleware是中間件激活的擴(kuò)展點(diǎn)。
UseMiddleware擴(kuò)展方法檢查中間件的已注冊(cè)類(lèi)型是否實(shí)現(xiàn)IMiddleware。如果是,則使用在容器中注冊(cè)的IMiddlewareFactory實(shí)例來(lái)解析IMiddleware實(shí)現(xiàn),而不使用基于約定的中間件激活邏輯。中間件在應(yīng)用的服務(wù)容器中注冊(cè)為作用域或瞬態(tài)服務(wù)。
優(yōu)點(diǎn):
- 按客戶端請(qǐng)求(作用域服務(wù)的注入)激活
- 讓中間件強(qiáng)類(lèi)型化
IMiddleware按客戶端請(qǐng)求(連接)激活,因此作用域服務(wù)可以注入到中間件的構(gòu)造函數(shù)中。
IMiddleware
IMiddleware定義應(yīng)用的請(qǐng)求管道的中間件。InvokeAsync(HttpContext, RequestDelegate)方法處理請(qǐng)求,并返回代表中間件執(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);
}
}
程序會(huì)為中間件創(chuàng)建擴(kuò)展:
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>();
}
}
無(wú)法通過(guò)UseMiddleware將對(duì)象傳遞給工廠激活的中間件:
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();
}
兩個(gè)中間件均在Startup.Configure的請(qǐng)求處理管道中注冊(cè):
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)建方法。中間件工廠實(shí)現(xiàn)在容器中注冊(cè)為作用域服務(wù)。
可在Microsoft.AspNetCore.Http包中找到默認(rèn)的IMiddlewareFactory實(shí)現(xiàn)(即MiddlewareFactory)。
到此這篇關(guān)于ASP.NET Core 中基于工廠的中間件激活詳解的文章就介紹到這了,更多相關(guān)ASP.NET Core中間件激活內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
"PageMethods未定義"或"對(duì)象不支持此屬性或方法"解決方法分享
PageMethods未定義或?qū)ο蟛恢С执藢傩曰蚍椒ń鉀Q方法,需要的朋友可以參考下。2010-12-12
WPF數(shù)據(jù)驅(qū)動(dòng)修改綁定
這篇文章介紹了WPF數(shù)據(jù)驅(qū)動(dòng)修改綁定的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
ASP.NET中JSON的序列化和反序列化使用說(shuō)明
JSON是專(zhuān)門(mén)為瀏覽器中的網(wǎng)頁(yè)上運(yùn)行的JavaScript代碼而設(shè)計(jì)的一種數(shù)據(jù)格式。2011-07-07
使用Blazor框架實(shí)現(xiàn)在前端瀏覽器中導(dǎo)入和導(dǎo)出Excel
Blazor?是一個(gè)相對(duì)較新的框架,用于構(gòu)建具有?.NET?強(qiáng)大功能的交互式客戶端?Web?UI,本文主要介紹了如何在?Blazor?應(yīng)用程序中實(shí)現(xiàn)?SpreadJS?利用?.NET?的強(qiáng)大功能完成瀏覽器端的?Excel?導(dǎo)入導(dǎo)出,需要的可以參考一下2023-05-05
ajax.net +jquery 無(wú)刷新三級(jí)聯(lián)動(dòng)的實(shí)例代碼
ajax.net +jquery 無(wú)刷新三級(jí)聯(lián)動(dòng)的實(shí)例代碼,需要的朋友可以參考一下2013-05-05
Asp.Net?Core7?preview4限流中間件新特性詳解
這篇文章主要為大家介紹了Asp.Net?Core7?preview4限流中間件的新特性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
.Net Core中間件之靜態(tài)文件(StaticFiles)示例詳解
這篇文章主要給大家介紹了關(guān)于.Net Core中間件之靜態(tài)文件(StaticFiles)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧2018-09-09
微信公眾平臺(tái)開(kāi)發(fā)之語(yǔ)音識(shí)別.Net代碼解析
這篇文章主要為大家詳細(xì)解析了微信公眾平臺(tái)開(kāi)發(fā)之語(yǔ)音識(shí)別.Net代碼,感興趣的小伙伴們可以參考一下2016-06-06
Asp.Mvc?2.0用戶客戶端驗(yàn)證實(shí)例講解(3)
這篇文章主要介紹了Asp.Mvc?2.0實(shí)現(xiàn)客戶端驗(yàn)證功能,本文使用jquery.validate插件進(jìn)行驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
.NET異步編程總結(jié)----四種實(shí)現(xiàn)模式代碼總結(jié)
本篇文章主要介紹了.NET異步編程總結(jié)----四種實(shí)現(xiàn)模式,詳細(xì)的介紹了每種方法的實(shí)現(xiàn)和實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12

