ASP.NET Core 的 Factory 中介軟體啟用
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
IMiddlewareFactory/IMiddleware 是一個中介軟體啟用的擴充點,可提供下列優點:
- 依據用戶端要求啟用 (插入範圍服務)
- 強型別的中介軟體
UseMiddleware 擴充方法會檢查中介軟體的已註冊類型是否實作 IMiddleware。 如果是,系統會使用容器中已註冊的 IMiddlewareFactory 執行個體來解析 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, SampleDbContext dbContext)
{
var keyValue = context.Request.Query["key"];
if (!string.IsNullOrWhiteSpace(keyValue))
{
dbContext.Requests.Add(new Request("Conventional", keyValue));
await dbContext.SaveChangesAsync();
}
await _next(context);
}
}
由 MiddlewareFactory 啟用的中介軟體:
public class FactoryActivatedMiddleware : IMiddleware
{
private readonly SampleDbContext _dbContext;
public FactoryActivatedMiddleware(SampleDbContext dbContext)
=> _dbContext = dbContext;
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var keyValue = context.Request.Query["key"];
if (!string.IsNullOrWhiteSpace(keyValue))
{
_dbContext.Requests.Add(new Request("Factory", keyValue));
await _dbContext.SaveChangesAsync();
}
await next(context);
}
}
您可為中介軟體建立延伸模組:
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseConventionalMiddleware(
this IApplicationBuilder app)
=> app.UseMiddleware<ConventionalMiddleware>();
public static IApplicationBuilder UseFactoryActivatedMiddleware(
this IApplicationBuilder app)
=> app.UseMiddleware<FactoryActivatedMiddleware>();
}
您無法使用 UseMiddleware 將物件傳遞給由 Factory 啟用的中介軟體:
public static IApplicationBuilder UseFactoryActivatedMiddleware(
this IApplicationBuilder app, bool option)
{
// Passing 'option' as an argument throws a NotSupportedException at runtime.
return app.UseMiddleware<FactoryActivatedMiddleware>(option);
}
由 Factory 所啟用中介軟體會新增至 Program.cs
中的內建容器:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<SampleDbContext>
(options => options.UseInMemoryDatabase("SampleDb"));
builder.Services.AddTransient<FactoryActivatedMiddleware>();
這兩個中介軟體都會在要求處理管線中註冊,也會在 Program.cs
中註冊:
var app = builder.Build();
app.UseConventionalMiddleware();
app.UseFactoryActivatedMiddleware();
IMiddlewareFactory 提供建立中介軟體的方法。 中介軟體 Factory 實作會在容器中註冊為範圍服務。
預設的 IMiddlewareFactory 實作是 MiddlewareFactory,其位於 Microsoft.AspNetCore.Http 套件中。
IMiddlewareFactory/IMiddleware 是中介軟體啟用的擴充點。
UseMiddleware 擴充方法會檢查中介軟體的已註冊類型是否實作 IMiddleware。 如果是,系統會使用容器中已註冊的 IMiddlewareFactory 執行個體來解析 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 將物件傳遞給由 Factory 啟用的中介軟體:
public static IApplicationBuilder UseFactoryActivatedMiddleware(
this IApplicationBuilder builder, bool option)
{
// Passing 'option' as an argument throws a NotSupportedException at runtime.
return builder.UseMiddleware<FactoryActivatedMiddleware>(option);
}
由 Factory 所啟用中介軟體會新增至 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 提供建立中介軟體的方法。 中介軟體 Factory 實作會在容器中註冊為範圍服務。
預設的 IMiddlewareFactory 實作是 MiddlewareFactory,其位於 Microsoft.AspNetCore.Http 套件中。
IMiddlewareFactory/IMiddleware 是中介軟體啟用的擴充點。
UseMiddleware 擴充方法會檢查中介軟體的已註冊類型是否實作 IMiddleware。 如果是,系統會使用容器中已註冊的 IMiddlewareFactory 執行個體來解析 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 將物件傳遞給由 Factory 啟用的中介軟體:
public static IApplicationBuilder UseFactoryActivatedMiddleware(
this IApplicationBuilder builder, bool option)
{
// Passing 'option' as an argument throws a NotSupportedException at runtime.
return builder.UseMiddleware<FactoryActivatedMiddleware>(option);
}
由 Factory 所啟用中介軟體會新增至 Startup.ConfigureServices
中的內建容器:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("InMemoryDb"));
services.AddTransient<FactoryActivatedMiddleware>();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
這兩個中介軟體都會在要求處理管線的 Startup.Configure
中註冊:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseConventionalMiddleware();
app.UseFactoryActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}
IMiddlewareFactory 提供建立中介軟體的方法。 中介軟體 Factory 實作會在容器中註冊為範圍服務。
預設的 IMiddlewareFactory 實作是 MiddlewareFactory,其位於 Microsoft.AspNetCore.Http 套件中。