2

基本クラスを継承するさまざまなクラスがあります。基本クラスは、インターフェイス 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:
                [...] }

ご覧のとおり、ILogger オブジェクトにアクセスできないため、ConnectionHealthCheck クラスのインスタンスを作成できません...

どうすればそれができますか?さまざまな解決策を考えていますが、答えも方法もわかりません

  • App.xaml.cs ではなく、HealthCheck サービスをビルドします。(たとえば、serviceCollection とロガーにアクセスできるビュー モデルで)

  • CreateHealthCheck メソッドで使用するロガーを取得する方法を見つけますか?

  • そのようなことをしますが、いつパラメーターを渡すことができるかわかりません

    serviceCollection.AddHealthChecks().AddCheck<ConnectionHealthCheck>(nameof(ConnectionHealthCheck));

4

2 に答える 2