我正在开发一个 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
?
编辑:我决定编辑以添加我的最终目标,看看是否有不同的方法来完成它。我的单例服务提供对可能来自两个不同位置的一些设置的访问。这些设置之一是数据库连接字符串。我需要在ConfigureServices 中使用该连接字符串,以便在调用时拥有它services.AddDbContext
。我还想在获取配置设置的服务中进行一些日志记录,这意味着我还需要获取 ILoggerFactory。
Calling BuildServiceProvider
from ConfigureServices
将导致创建单例服务的附加副本。
在这种特殊情况下,使用另一种方法来推迟对服务提供商的访问。AddDbContext
具有允许这种情况的重载,其中服务提供者作为选项操作委托的一部分提供。
//...
services.AddSingleton<IMyService, MyService>();
services.AddDbContext<MyDbContext>((serviceProvider, options) =>
options.UseMySql(serviceProvider.GetRequiredService<IMyService>().DBConnectionString)
);
//....
参考AddDbContext<TContext>(IServiceCollection, Action<IServiceProvider,DbContextOptionsBuilder>, ServiceLifetime, ServiceLifetime) https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.entityframeworkservicecollectionextensions.adddbcontext?view=efcore-2.1#Microsoft_Extensions_DependencyInjection_EntityFrameworkServiceCollectionExtensions_AddDbContext__1_Microsoft_Extensions_DependencyInjection_IServiceCollection_System_Action_System_IServiceProvider_Microsoft_EntityFrameworkCore_DbContextOptionsBuilder__Microsoft_Extensions_DependencyInjection_ServiceLifetime_Microsoft_Extensions_DependencyInjection_ServiceLifetime_
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)