Jam*_*mes 2 c# dependency-injection asp.net-core
我正在处理一个 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));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码对我来说很好用,可以在 ConfigureServices 中使用“MyService”。但是稍后在我的应用程序中,当我尝试使用 MyService 时,将再次调用 MyService 的构造函数。为什么不使用自我使用注册类以来已经创建的实例AddSingleton?
编辑:我决定编辑以添加我的最终目标,看看是否有不同的方法来完成它。我的单例服务提供对一些可能来自 2 个不同地方的设置的访问。这些设置之一是数据库连接字符串。我在 ConfigureServices 中需要那个连接字符串,所以当我调用services.AddDbContext. 我还想在获取配置设置的服务中进行一些日志记录,这意味着我还需要获取 ILoggerFactory。
调用BuildServiceProviderfromConfigureServices将导致创建单例服务的额外副本。
在这种特殊情况下,使用另一种延迟访问服务提供商的方法。AddDbContext有一个允许这种情况的重载,其中服务提供者作为选项操作委托的一部分提供。
//...
services.AddSingleton<IMyService, MyService>();
services.AddDbContext<MyDbContext>((serviceProvider, options) =>
options.UseMySql(serviceProvider.GetRequiredService<IMyService>().DBConnectionString)
);
//....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1962 次 |
| 最近记录: |