我有一系列判断数据的服务,都在"IDataCheck"界面下.

IDataChecks是一个空接口,只有一个方法"runCheckAsync"

在命令行应用程序中,我执行以下操作:

IEnumerable<IDataCheck>? services = _serviceProvider.GetServices<IDataCheck>();
foreach (IDataCheck? s in services)
{
    DataCheckResult result = await s.RunCheckAsync();
    // all kinds of stuff with the result such as proposing to autofix
}

我现在还想在asp中显示这些判断的结果.net core healtchecks还使用healthcheck ui,参考:

我不想 for each 数据判断手动创建一个healthcheck,因为否则拥有一个接口的用处就没有了

我也不想只创建一个healthcheck,否则它将在ui中的一个纯文本列中生成一长串结果,因为它不支持任何格式.

推荐答案


在Guru的 comments 帮助下,在"WebApplication app=builder.Build();"之前的一行中解决了这个问题呼叫:

public static IServiceCollection AddDataHealthChecks(this IServiceCollection services)
{
    List<string> dataCheckClassList = new List<string>();
    IEnumerable<ServiceDescriptor>? dataServices = services.Where(x => x.ServiceType == typeof(IDataCheck));        
    foreach (ServiceDescriptor s in dataServices)
    {
        var fullName = s.ImplementationType?.FullName;
        if (fullName is not null)
        {
            dataCheckClassList.Add(fullName);
        }
    }
    foreach(string fullName in dataCheckClassList)
    {
        services
                .AddHealthChecks()
                .AddTypeActivatedCheck<DataQualityHealthCheck>(fullName,
                    failureStatus: HealthStatus.Degraded,
                    tags: new[] { "data" },
                    args: new object[] { fullName });
    }

    return services;
}

然后在healtcheck本身中:

IDataCheck? service = _serviceProvider
            .GetServices<IDataCheck>().FirstOrDefault(x => (x.ToString() == _dataCheckServiceName));
if (service is not null)
{
   DataCheckResult result = await service.RunCheckAsync();
   // etc
}

Csharp相关问答推荐

将json作为字符串发送到API会导致错误,但发送dotnet对象不会

声明和实例化时抽象类和Generics的结合问题

我正在制作一个Unity游戏,如果对这个玩家控制器进行编码,但当它 skip 时,它会删除我的速度

C#中的两个线程之间读写浮点类型

[0-n]范围内有多少个Integer在其小数表示中至少包含一个9?

如何使用while循环实现异常处理

为什么C#Bigbit不总是相同的比特长度?

XUNIT是否使用测试数据的源生成器?

静态对象构造顺序

Blazorise折线图仅绘制数据集的一部分

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

更改执行目录

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

如何在NET 8最小API中自动记录TypedResults.Stream响应

如何在C#中创建VS代码中的控制台应用程序时自动生成Main方法

.NET:从XPath定位原始XML文档中的 node

升级后发出SWITCH语句

用于获取字符串的最后12个字符的正则表达式(空格除外)

避免在特定区域中设置Visual Studio代码的自动格式

客户端/服务器RPC如何处理全局变量?