ASP.NET Core 高階(二)【基於工廠的中介軟體】
ASP.NET Core 中基於工廠的中介軟體啟用
IMiddlewareFactory/IMiddleware
是中介軟體
啟用的擴充套件點。
UseMiddleware
擴充套件方法檢查中介軟體的已註冊型別是否實現 IMiddleware
。 如果是,則使用在容器中註冊的 IMiddlewareFactory
例項來解析 IMiddleware
實現,而不使用基於約定的中介軟體啟用邏輯。中介軟體在應用的服務容器中註冊為作用域或瞬態服務。
優點:
- 按請求(作用域服務的注入)啟用
- 讓中介軟體強型別化
IMiddleware
按請求啟用,因此作用域服務可以注入到中介軟體的建構函式中。
示例應用演示了使用以下兩種方式啟用的中介軟體:
- 約定。 有關使用約定啟用中介軟體的詳細資訊,請參閱中介軟體主題。
IMiddleware
實現。 預設的MiddlewareFactory
類可啟用中介軟體。
這兩種中介軟體實現的功能相同,並能記錄由查詢字串引數 (key) 提供的值。 中介軟體使用插入的資料庫上下文(作用域服務)將查詢字串值記錄在記憶體中資料庫。
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.cs
的內建容器中:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("InMemoryDb"));
services.AddTransient<FactoryActivatedMiddleware>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
兩個中介軟體均在 Configure
的請求處理管道中註冊:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseConventionalMiddleware();
app.UseFactoryActivatedMiddleware();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
IMiddlewareFactory
IMiddlewareFactory
提供中介軟體的建立方法。 中介軟體工廠實現在容器中註冊為作用域服務。
可在 Microsoft.AspNetCore.Http
包中找到預設的 IMiddlewareFactory
實現(即 MiddlewareFactory
)。
相關文章
- ASP.NET Core 中基於工廠的中介軟體啟用ASP.NET
- ASP.NET Core 高階(三)【使用第三方容器的基於工廠的中介軟體】ASP.NET
- ASP.NET Core 中介軟體的使用(二):依賴注入的使用ASP.NET依賴注入
- ASP.NET Core 中介軟體基本用法ASP.NET
- ASP.NET Core - 自定義中介軟體ASP.NET
- [譯]ASP.NET Core 2.0 中介軟體ASP.NET
- ASP.NET Core 2.2 基礎知識(十)【中介軟體】ASP.NET
- Asp.Net Core基礎篇之:白話管道中介軟體ASP.NET
- ASP.NET Core 中介軟體(Middleware)(一)ASP.NET
- asp.net core mvc 管道之中介軟體ASP.NETMVC
- ASP.NET Core中的中介軟體及其工作原理ASP.NET
- ASP.NET Core中介軟體初始化探究ASP.NET
- ASP.NET Core - 請求管道與中介軟體ASP.NET
- 換個角度學習ASP.NET Core中介軟體ASP.NET
- Asp.Net Core入門之自定義中介軟體ASP.NET
- ASP.NET Core中介軟體與HttpModule有何不同ASP.NETHTTP
- [譯]ASP.NET Core 2.0 帶初始引數的中介軟體ASP.NET
- ASP.NET Core 基於JWT的認證(二)ASP.NETJWT
- 深入探究ASP.NET Core異常處理中介軟體ASP.NET
- asp .net core 中介軟體
- asp.net core 自定義中介軟體【以dapper為例】ASP.NETAPP
- ASP.NET Core中介軟體計算Http請求時間ASP.NETHTTP
- ASP.NET Core 中介軟體詳解及專案實戰ASP.NET
- asp.net core3.1 實戰開發(中介軟體的詳解)ASP.NET
- .NET Core基礎篇之:白話管道中介軟體
- 基於gin的golang web開發:中介軟體GolangWeb
- 高階工程師面試大全- 訊息中介軟體篇工程師面試
- Asp.Net Core中Typed HttpClient高階用法ASP.NETHTTPclient
- ASP.NET Core如何知道一個請求執行了哪些中介軟體?ASP.NET
- 基於.NET CORE微服務框架 -談談Cache中介軟體和快取降級微服務框架快取
- 關於中介軟體的思考
- Express框架(二)—— 中介軟體Express框架
- 2020年電工(高階)試題及答案及電工(高階)考試軟體
- .NET Core 自定義中介軟體 Middleware
- .Net Core如何優雅的實現中介軟體
- 基於中介軟體的查詢最佳化模型 (轉)模型
- 徹底搞懂Scrapy的中介軟體(二)
- ASP.NET Core 高階(一)【.NET 的開放 Web 介面 (OWIN)】ASP.NETWeb