ASP.NET Core DI 手動獲取注入對象:https://www.cnblogs.com/xishuai/p/asp-net-core-ioc-di-get-service.html
方法1(獲取Transient
和Singleton
注入的對象):
在 Startup 類的 Configure 方法中,獲取 DI 容器,然后保留在一個靜態類的靜態屬性中。
補充:需要注意的是,使用ServiceLocator.Instance.GetService<T>();
,只能獲取Transient
和Singleton
注入的對象,而不能獲取 Scoped
(請求生命周期內唯一)注入的對象,不是不能獲取,而是獲取的和構造函數獲取的不是相同對象,也就是說獲取的對象沒有共享。
public void Configure(IApplicationBuilder app)
{
ServiceLocator.Instance = app.ApplicationServices; //獲取一個 IServiceProvider 。
}
public static class ServiceLocator
{
public static IServiceProvider Instance { get; set; }
}
------------ 說明:在 項目 ,有如下代碼用於數據遷移。 https://github.com/enkodellc/blazorboilerplate/blob/0.2.3/src/BlazorBoilerplate.Server/Startup.cs
參考知識: ASP.NET Core中的依賴注入(4): 構造函數的選擇與服務生命周期管理
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApplicationDbContextSeed applicationDbContextSeed)
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>().Database.Migrate();
}
方法2:獲取 Scoped
(請求生命周期內唯一)注入的對象
通過 httpContext 的屬性 HttpContext.RequestServices ,是一個IServiceProvider (DI 子容器)。 參考 https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.httpcontext.requestservices?view=aspnetcore-3.1#Microsoft_AspNetCore_Http_HttpContext_RequestServices
如果是 API 控制器(Controller) 的基類 ControllerBase (Microsoft.AspNetCore.Mvc) 有屬性 HttpContext , 可以使用,或者 ControllerContext.