ASP.NET Core 高階(三)【使用第三方容器的基於工廠的中介軟體】
使用 ASP.NET Core 中的第三方容器啟用中介軟體
本文演示如何使用 IMiddlewareFactory
和 IMiddleware
作為使用第三方容器啟用中介軟體的可擴充套件點。 有關 IMiddlewareFactory
和 IMiddleware
的介紹性資訊,請參閱基於工廠的中介軟體啟用主題。
示例應用演示了使用 IMiddlewareFactory
、SimpleInjectorMiddlewareFactory
實現啟用的中介軟體。 此示例使用 Simple Injector
依賴項注入 (DI) 容器。
此示例的中介軟體實現記錄了查詢字串引數 (key
) 提供的值。 中介軟體使用插入的資料庫上下文(有作用域的服務)將查詢字串值記錄在記憶體中資料庫。
此示例應用僅出於演示目的使用
Simple Injector
。 不認可使用 Simple Injector。 Simple Injector 文件中描述的中介軟體啟用方法和 Simple Injector 維護人員推薦的 GitHub 問題。 有關詳細資訊,請參閱 Simple Injector 文件和 Simple Injector GitHub 儲存庫。
IMiddlewareFactory
IMiddlewareFactory
提供中介軟體的建立方法。
在示例應用中,實現了中介軟體工廠以建立 SimpleInjectorActivatedMiddleware
例項。 中介軟體工廠使用 Simple Injector
容器來解析中介軟體:
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware
IMiddleware
定義應用的請求管道的中介軟體。
由 IMiddlewareFactory
實現 (Middleware/SimpleInjectorActivatedMiddleware.cs
) 啟用的中介軟體:
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(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 = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
為中介軟體建立擴充套件 (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
必須執行多項任務:
- 設定
Simple Injector
容器。 - 註冊工廠和中介軟體。
- 為
Razor
頁面的Simple Injector
容器建立應用的資料庫上下文。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
中介軟體在 Startup.Configure
的請求處理管道中註冊:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
相關文章
- 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基礎篇之:白話管道中介軟體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 2.0 帶初始引數的中介軟體ASP.NET
- 基於docker構建中介軟體容器應用環境Docker
- 換個角度學習ASP.NET Core中介軟體ASP.NET
- Asp.Net Core入門之自定義中介軟體ASP.NET
- ASP.NET Core中介軟體與HttpModule有何不同ASP.NETHTTP
- asp.net core3.1 實戰開發(中介軟體的詳解)ASP.NET
- 深入探究ASP.NET Core異常處理中介軟體ASP.NET
- asp .net core 中介軟體
- 基於gin的golang web開發:中介軟體GolangWeb
- asp.net core 自定義中介軟體【以dapper為例】ASP.NETAPP
- ASP.NET Core中介軟體計算Http請求時間ASP.NETHTTP
- ASP.NET Core 中介軟體詳解及專案實戰ASP.NET
- 關於中介軟體的思考
- 中介軟體redis的使用Redis
- .NET Core基礎篇之:白話管道中介軟體
- Redux 進階 -- 編寫和使用中介軟體Redux
- .Net Core如何優雅的實現中介軟體
- 基於中介軟體的查詢最佳化模型 (轉)模型
- 高階工程師面試大全- 訊息中介軟體篇工程師面試
- Asp.Net Core中Typed HttpClient高階用法ASP.NETHTTPclient
- ASP.NET Core如何知道一個請求執行了哪些中介軟體?ASP.NET
- 基於.NET CORE微服務框架 -談談Cache中介軟體和快取降級微服務框架快取
- 徹底搞懂Scrapy的中介軟體(三)
- ASP.NET Core 高階(一)【.NET 的開放 Web 介面 (OWIN)】ASP.NETWeb
- 一文說通Dotnet Core的中介軟體