簡體   English   中英

多次創建 ASP.NET Core 單例服務

[英]ASP.NET Core Singleton Service created multiple times

我正在處理一個 ASP.NET Core 2.1 項目,我需要在其中注冊,然后在 Startup.ConfigureServices 中使用單例服務。

我有以下代碼:

public void ConfigureServices(IServiceCollection services)
{
    //....
    //....

    services.AddSingleton<IMyService,MyService>();

    var serviceProvider = services.BuildServiceProvider();

    var myService = serviceProvider.GetService<IMyService>();

    services.AddDbContext<MyDbContext>(options => options.UseMySql(myService.DBConnectionString));
}

上面的代碼對我來說很好用,可以在 ConfigureServices 中使用“MyService”。 但是稍后在我的應用程序中,當我嘗試使用 MyService 時,再次調用了 MyService 的構造函數。 為什么不使用已經創建的實例,因為我使用AddSingleton注冊了類?

編輯:我決定編輯以添加我的最終目標,看看是否有不同的方法來完成它。 我的單例服務提供對一些可能來自 2 個不同地方的設置的訪問。 這些設置之一是數據庫連接字符串。 我在 ConfigureServices 中需要那個連接字符串,所以當我調用services.AddDbContext時我有它。 我還想在獲取配置設置的服務中進行一些日志記錄,這意味着我還需要獲取 ILoggerFactory。

ConfigureServices調用BuildServiceProvider將導致創建單例服務的額外副本。

在這種特殊情況下,使用另一種延遲訪問服務提供商的方法。 AddDbContext有一個允許這種情況的重載,其中服務提供者作為選項操作委托的一部分提供。

//...

services.AddSingleton<IMyService, MyService>();

services.AddDbContext<MyDbContext>((serviceProvider, options) =>
    options.UseMySql(serviceProvider.GetRequiredService<IMyService>().DBConnectionString)
);

//....

參考AddDbContext<TContext>(IServiceCollection, Action<IServiceProvider,DbContextOptionsBuilder>, ServiceLifetime, ServiceLifetime)

AddSingleton告訴 Unity 構造它一次。 “一次”是您在代碼中直接調用的任何構造函數的補充。

如果您想重新使用您創建的實例,請改用AddInstance

var serviceProvider = services.BuildServiceProvider();

var myService = serviceProvider.GetService<IMyService>();

services.AddInstance<IMyService>(myService);

services.AddDbContext<MyDbContext>(options => options.UseMySql(myService.DBConnectionString));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM