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