IHealthChecksBuilder.AddTypeActivatedCheck 可以访问 IServiceProvider

问题描述 投票:0回答:1

有没有办法将

IHealthChecksBuilder.AddTypeActivatedCheck<T>()
Action<IServiceProvider>
的委托函数一起使用?我需要能够访问服务容器并解决依赖关系才能构建检查。我看不出用那种方法可以做到这一点。当然,我可以使用
AddScoped<IHealthCheck>(Action<IServiceProvider> action)
方法签名来执行此操作,但现在我看不到如何设置健康检查的元数据信息(名称、标签、故障条件等)。

c# .net-core dependency-injection health-check
1个回答
0
投票
我需要能够访问服务容器并解决依赖关系才能构建检查。

通常你不需要这样做,因为

AddTypeActivatedCheck
可以解析所有需要的参数并将其传递给健康检查ctor(即将构造逻辑移动到那里)。从文档中的评论:

此方法将在需要时使用

ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
创建健康检查实例。可以通过 args 向构造函数提供其他参数。

即对于以下 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
        ));

请参阅文档的分发运行状况检查库部分。

© www.soinside.com 2019 - 2024. All rights reserved.