如何在AspNetCore.Diagnostics.HealthCheck.AddSqlServer中使用connectionStringFactory?
关于AddSqlServer健康检查中连接字符串工厂的实现问题
问题背景
AddSqlServer健康检查有一个接受连接字符串工厂的方法签名:
public static IHealthChecksBuilder AddSqlServer( this IHealthChecksBuilder builder, Func<IServiceProvider, string> connectionStringFactory, ...)
我不确定该如何实现它。我有一个返回连接字符串的工厂,但它需要注入一些IOptions。另外,我不明白在添加健康检查的同时,如何使用已注册到builder中的工厂,我认为这无法实现。
我的代码示例如下:
builder.Services.AddOptions() // 此处添加了一些配置项 builder.Services.AddScoped<IConnectionStringFactory, ConnectionStringFactory>(); builder.Services.AddHealthChecks() .AddSqlServer(_ => { factoryCalled = true; // 这里要如何获取我的工厂实例? return "connectionstring"; });
这让我想问,官方的设计意图是什么?我是否需要提供工厂的新实例?如果是这样的话,就没那么实用了,因为我还需要手动创建工厂所需的所有依赖项。
解决方案
正确实现方式
你完全不需要手动创建工厂实例,这个重载的Func<IServiceProvider, string>参数就是为了让你复用DI容器中已注册的服务。直接利用参数提供的IServiceProvider,就能拿到你之前注册的IConnectionStringFactory以及它依赖的IOptions:
// 先配置你的选项(假设你的选项类为MyDbOptions) builder.Services.AddOptions<MyDbOptions>() .Configure<IConfiguration>((options, config) => { config.GetSection("MyDb").Bind(options); }); // 注册你的连接字符串工厂 builder.Services.AddScoped<IConnectionStringFactory, ConnectionStringFactory>(); // 添加健康检查时,通过IServiceProvider获取工厂 builder.Services.AddHealthChecks() .AddSqlServer(sp => { // 从DI容器中获取已注册的工厂实例 var connectionStringFactory = sp.GetRequiredService<IConnectionStringFactory>(); // 调用工厂方法获取连接字符串 return connectionStringFactory.GetConnectionString(); });
官方设计意图解析
这个重载的设计核心就是复用DI容器中的现有服务,避免手动构建复杂的依赖链:
Func<IServiceProvider, string>的参数sp是整个应用的DI容器服务提供者,能访问所有你之前注册的服务(包括IOptions、自定义工厂等)。- 你的
ConnectionStringFactory依赖的IOptions会由DI自动注入,不需要你手动实例化任何依赖项。 - 这种方式支持动态获取连接字符串(比如根据环境、配置变化等场景),比直接传入固定连接字符串更灵活。
内容的提问来源于stack exchange,提问作者Sailing Judo
相关产品推荐
相关产品推荐

