有没有办法将
IHealthChecksBuilder.AddTypeActivatedCheck<T>()
与 Action<IServiceProvider>
的委托函数一起使用?我需要能够访问服务容器并解决依赖关系才能构建检查。我看不出用那种方法可以做到这一点。当然,我可以使用 AddScoped<IHealthCheck>(Action<IServiceProvider> action)
方法签名来执行此操作,但现在我看不到如何设置健康检查的元数据信息(名称、标签、故障条件等)。
AddTypeActivatedCheck
可以解析所有需要的参数并将其传递给健康检查ctor(即将构造逻辑移动到那里)。从文档中的评论:
此方法将在需要时使用
创建健康检查实例。可以通过 args 向构造函数提供其他参数。ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
即对于以下 3 个参数的检查,其中 2 个将从 DI 解析:
public class SampleHealthCheck(SomeService serv, int i, SomeService2 someService2) : IHealthCheck
{
public Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context, CancellationToken cancellationToken = default)
{
return Task.FromResult(
HealthCheckResult.Healthy("A healthy result."));
}
}
您可以使用以下注册方式:
builder.Services.AddSingleton<SomeService>();
builder.Services.AddSingleton<SomeService2>();
builder.Services.AddHealthChecks()
.AddTypeActivatedCheck<SampleHealthCheck>("sample", 42);
但是,如果这是一种罕见的情况,当您有某种工厂逻辑(并且您不想将其移动到运行状况检查实现)或其他阻止通过 healthckeck ctor 注入所有所需依赖项时,那么您可以使用
HealthCheckRegistration
直接上课:
builder.Services.AddHealthChecks()
.Add(new HealthCheckRegistration(
"sample",
sp => new SampleHealthCheck(sp.GetRequiredService<SomeService>(), 42, sp.GetRequiredService<SomeService2>()),
failureStatus: HealthStatus.Unhealthy,
tags: null
));
请参阅文档的分发运行状况检查库部分。