ASP.NET Core 单例服务被创建多次

3
我是一个ASP.NET Core 2.1项目的助手,需要在Startup.ConfigureServices中注册和使用单例服务。
以下是我的代码:

我有以下代码:

Original Answer: "最初的回答"
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个不同地方的设置的访问。其中一个设置是DB连接字符串。我需要在ConfigureServices中使用该连接字符串,以便在调用services.AddDbContext时拥有它。我还想在获取配置设置的服务中进行一些日志记录,这意味着我还需要获取ILoggerFactory。

1
因为它们是从两个不同的服务提供商调用的。一个是您在配置服务方法中手动构建的,另一个是在该方法超出范围后由框架构建的。 - Nkosi
@Nkosi 我在原帖中添加了一些编辑来说明我想要做什么。也许有其他的方法可以实现吗? - James
@Nkosi 我并没有尝试其他的东西,因为我甚至不确定从哪里开始。 - James
1
这可能是一个XY问题 - Nkosi
那么我认为这才是你应该问的实际问题。 - Nkosi
显示剩余6条评论
2个回答

8

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)

这是一个用于向.NET Core应用程序中添加Entity Framework的方法。它允许您将DbContext添加到依赖注入容器中,以便在整个应用程序中使用它。使用此方法时,您可以指定要使用的DbContext类型、如何配置它以及它应该被注册为什么生命周期。

0

AddSingleton 告诉 Unity 只构造一次。这个“一次”是除了你在代码中直接调用的任何构造函数之外的。

如果你想重复使用你创建的实例,请使用 AddInstance

var serviceProvider = services.BuildServiceProvider();

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

services.AddInstance<IMyService>(myService);

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

在将IMyService添加到services之前,是否可以从serviceProvider获取实例? - Hamid Mayeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接