ASP.NET Core DI 手動獲取注入對象 (轉)


ASP.NET Core DI 手動獲取注入對象:https://www.cnblogs.com/xishuai/p/asp-net-core-ioc-di-get-service.html

方法1(獲取TransientSingleton注入的對象

     在 Startup 類的 Configure 方法中,獲取 DI 容器,然后保留在一個靜態類的靜態屬性中。

     補充:需要注意的是,使用ServiceLocator.Instance.GetService<T>();,只能獲取TransientSingleton注入的對象,而不能獲取 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.

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM