[英]Singleton service constructed multiple times when using hangfire in asp.net core c#
[英]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)
);
//....
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.