如何通过依赖项注入将健康检查添加到.net6服务中



我正在尝试向后台服务添加多个健康检查。我不希望添加后台服务的核心应用程序知道或必须添加核心应用程序级别的所有健康检查的详细信息。我可以在服务构造函数中添加一个IHealthChecksBuilder,并为后台服务类中的每个检查添加一个IHealthCheck类。但是我该如何引用后台服务的对象或配置呢。我只写了几个CLEAN架构项目,所以我仍在努力掌握窍门,将逻辑推向更深的层次,并保持组件完全分离。

我试图在我的程序中避免的事情.cs:

services.AddHostedService<ETL>();
services.AddHealthChecks()
.ForwardToPrometheus()
.AddCheck<StartupHealthCheck>("ETL");

我想由一个简单的人来处理。

services.AddHostedService<ETL>();
services.AddHealthChecks()
.ForwardToPrometheus();

感谢的帮助

您可以添加一个扩展方法来自动在程序集中查找和注册检查:

public static class HealthChecksExtensions
{
public static IHealthChecksBuilder AddAssemblyChecks(this IHealthChecksBuilder checksBuilder, params Assembly[] assemblies)
{
var checks = assemblies
.SelectMany(a => a.GetTypes())
.Where(a => !a.IsAbstract && !a.IsInterface && !a.IsGenericTypeDefinition && a.IsAssignableTo(typeof(IHealthCheck)));
foreach (var check in checks)
{
var registration = new HealthCheckRegistration(
check.GetType().Name,
sp => (IHealthCheck)ActivatorUtilities.GetServiceOrCreateInstance(sp, check),
null,
null
);
checksBuilder.Add(registration);
}
return checksBuilder;
}
}

用法:

services.AddHealthChecks()
.ForwardToPrometheus()
.AddAssemblyChecks(Assembly.GetEntryAssembly());

或者,如果运行状况检查在您添加到项目的另一个程序集(库(中,您可以在那里添加一个不接受params Assembly[] assemblies的扩展方法,而在该方法中使用Assembly.GetExecutingAssembly(),该方法将在程序集中找到该扩展方法所属的任何方法:

public static class HealthChecksExtensions
{
public static IHealthChecksBuilder AddAssemblyChecks(this IHealthChecksBuilder checksBuilder)
{
var checks = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(a => !a.IsAbstract && !a.IsInterface && !a.IsGenericTypeDefinition && a.IsAssignableTo(typeof(IHealthCheck)));
foreach (var check in checks)
{
var registration = new HealthCheckRegistration(
check.GetType().Name,
sp => (IHealthCheck)ActivatorUtilities.GetServiceOrCreateInstance(sp, check),
null,
null
);
checksBuilder.Add(registration);
}
return checksBuilder;
}
}

或者,如果你可以手动注册支票,但在其他地方:

public static class HealthCheckExtensions
{
public static IHealthChecksBuilder AddMyChecks(this IHealthChecksBuilder checksBuilder)
{
checksBuilder.AddCheck<StartupHealthCheck>("ETL");
return checksBuilder;
}
}

用法:

services.AddHealthChecks()
.ForwardToPrometheus()
.AddMyChecks();

最新更新