У меня есть разные классы, которые наследуют базовый класс. Базовый класс реализует интерфейс 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...
Итак, как я могу это сделать? Я думаю о разных решениях, но у меня нет ответа или способа сделать это
Создайте службу HealthCheck не в App.xaml.cs, а после ? (В модели представления, например, где у меня есть доступ к serviceCollection и регистратору)
Найдите способ заставить регистратор использовать его в методе CreateHealthCheck?
Сделайте что-нибудь подобное, но я не знаю, когда смогу передать параметры
serviceCollection.AddHealthChecks().AddCheck<ConnectionHealthCheck>(nameof(ConnectionHealthCheck));