我正在处理一个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。
答案 0 :(得分:1)
在这种特殊情况下,您可以使用另一种方法来推迟对服务提供商的访问
//...
services.AddSingleton<IMyService,MyService>();
services.AddDbContext<MyDbContext>((serviceProvider, options) =>
options.UseMySql(serviceProvider.GetService<IMyService>().DBConnectionString)
);
//....
答案 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));