gpt4 book ai didi

c# - 多次创建 ASP.NET Core 单例服务

转载 作者:行者123 更新时间:2023-12-05 09:13:03 24 4
gpt4 key购买 nike

我正在开发一个 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。

最佳答案

调用 BuildServiceProvider来自 ConfigureServices将导致创建单例服务的额外副本。

在这种特殊情况下,使用另一种方法推迟对服务提供商的访问。 AddDbContext有一个允许这种情况的重载,其中服务提供者作为选项操作委托(delegate)的一部分提供。

//...

services.AddSingleton<IMyService, MyService>();

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

//....

引用 AddDbContext<TContext>(IServiceCollection, Action<IServiceProvider,DbContextOptionsBuilder>, ServiceLifetime, ServiceLifetime)

关于c# - 多次创建 ASP.NET Core 单例服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56781807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com