我有不同的类继承基类。基类实现接口 IHealthCheck。每个类都有一个构造函数,根据类需要一个记录器和参数。例如 :
public ConnectionHealthCheck(ILogger logger, string address)
: base(logger)
{
Address = address;
}
我有一个 appSettings.json,它允许我在我的健康检查服务中配置几个诊断。
我在 App.xaml.cs 中获得了诊断列表,并尝试将它们添加到 HealthCheck 列表中。
问题是我不能使用旁边的参数进行依赖注入,而且我不知道什么是最好的解决方案......
这是我的代码的一些部分。
OnStartup 方法:
protected override void OnStartup(StartupEventArgs e)
{
var a = Assembly.GetExecutingAssembly();
using var stream = a.GetManifestResourceStream("appsettings.json");
Configuration = new ConfigurationBuilder()
.AddJsonStream(stream)
.Build();
var host = new HostBuilder()
.ConfigureHostConfiguration(c => c.AddConfiguration(Configuration))
.ConfigureServices(ConfigureServices)
.ConfigureLogging(ConfigureLogging)
.Build();
[...] }
configureService 方法:
private void ConfigureServices(IServiceCollection serviceCollection)
{
// create and add the healthCheck for each diag in the appSettings file
List<DiagnosticConfigItem> diagnostics = Configuration.GetSection("AppSettings:Diagnostics").Get<List<DiagnosticConfigItem>>();
diagnostics.ForEach(x => CreateHealthCheck(serviceCollection, x));
[...] }
而 CreateHealthCheck 方法问题出在哪里:
private void CreateHealthCheck(IServiceCollection serviceCollection, DiagnosticConfigItem configItem)
{
EnumDiagType type;
try
{
type = (EnumDiagType)Enum.Parse(typeof(EnumDiagType), configItem.Type, true);
}
catch (Exception)
{
throw new Exception("Diagnostic type not supported");
}
switch (type)
{
case EnumDiagType.Connection:
serviceCollection.AddHealthChecks().AddCheck(nameof(ConnectionHealthCheck), new ConnectionHealthCheck(???, configItem.Value));
break;
case EnumDiagType.Other:
[...] }
如您所见,我无法创建 ConnectionHealthCheck 类的实例,因为我无法访问 ILogger 对象...
那么我该怎么做呢?我考虑了不同的解决方案,但我没有答案或方法
不在 App.xaml.cs 中而是在之后构建 HealthCheck 服务?(在我可以访问 serviceCollection 和记录器的示例视图模型中)
找到一种方法让记录器在 CreateHealthCheck 方法中使用它?
做类似的事情,但我不知道什么时候可以传递参数
serviceCollection.AddHealthChecks().AddCheck<ConnectionHealthCheck>(nameof(ConnectionHealthCheck));