多次创建ASP.NET Core Singleton Service

时间:2019-06-26 22:44:35

标签: c# asp.net-core dependency-injection

我正在处理一个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。

2 个答案:

答案 0 :(得分:1)

在这种特殊情况下,您可以使用另一种方法来推迟对服务提供商的访问

//...

services.AddSingleton<IMyService,MyService>();

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

//....

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

答案 1 :(得分: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));