詳解ASP.NET Core 中基于工廠的中間件激活的實現(xiàn)方法
IMiddlewareFactory/IMiddleware是中間件激活的擴展點。
UseMiddleware擴展方法檢查中間件的已注冊類型是否實現(xiàn)IMiddleware。如果是,則使用在容器中注冊的IMiddlewareFactory實例來解析IMiddleware實現(xiàn),而不使用基于約定的中間件激活邏輯。中間件在應用的服務容器中注冊為作用域或瞬態(tài)服務。
優(yōu)點:
- 按客戶端請求(作用域服務的注入)激活
- 讓中間件強類型化
IMiddleware按客戶端請求(連接)激活,因此作用域服務可以注入到中間件的構造函數(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的內置容器中:
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中間件激活內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
.NET RulesEngine(規(guī)則引擎)的使用詳解
這篇文章主要介紹了.NET RulesEngine(規(guī)則引擎)的使用詳解,幫助大家更好的理解和學習使用.net技術,感興趣的朋友可以了解下2021-05-05
ASP.NET MVC 3仿Server.Transfer效果的實現(xiàn)方法
這篇文章主要介紹了ASP.NET MVC 3仿Server.Transfer效果的實現(xiàn)方法,需要的朋友可以參考下2015-10-10
ASP.NET獲取MS SQL Server安裝實例實現(xiàn)思路及代碼
在演示中,是把找到的實例顯示于DropDownList控件中。首先在.aspx拉一個DropDownList控件,感興趣的朋友可以了解下哦,或許對你有所幫助2013-01-01
從請求管道深入剖析HttpModule的實現(xiàn)機制圖文介紹
想要了解底層的原理必須對請求處理過程和頁面的生命周期有點了解才方便您入門學習一下內容,本文將詳細介紹2012-11-11
ASP.NET中repeater嵌套實現(xiàn)代碼(附源碼)
repeater嵌套經(jīng)常會在一些特殊效果顯示下會用到,新手朋友們可以詳細看下本文,希望對你有所幫助,代碼很整潔同時附有源碼2013-03-03
asp.net類庫中添加WebService引用出現(xiàn)問題解決方法
在Web項目內添加WebService的引用是件很簡單的事情,不過對于一些新手朋友來說,就沒有那么簡單了,因為在添加的過程中總會遇到一些困難,接下來詳細介紹如何解決,感興趣的你可不要錯過了啊2013-02-02

