Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ Build artifacts go to `/artifacts/bin/` (configured in `Directory.Build.props`).
|---|---|
| `Abstractions/` | `IHealthMonitor`, `IStopwatch`, `ISystemTimeProvider` |
| `Detection/` | `RealStopwatch`, `SystemTimeProvider` — production implementations of the abstractions |
| `Monitors/` | `HealthMonitorBase` (state machine), `NamedHealthMonitor`, `HealthMonitorCoordinator`, `DynamicHealthMonitorManager` |
| `Monitors/` | `HealthMonitorBase` (state machine), `NamedHealthMonitor`, `HealthMonitorCoordinator` (fans out `Tick()` to all registered monitors), `DynamicHealthMonitorManager` |
| `Services/` | `HealthMonitorHostedService` — background loop, ticks coordinator at `MinCheckInterval` |
| `Configuration/` | `HealthMonitorOptions`, `HealthMonitorRegistration` |
| `Configuration/` | `HealthMonitorOptions` (thresholds/intervals), `HealthMonitorRegistration` (name + options pair used at DI registration) |
| `Extensions/` | `AddHealthMonitor()` DI extension |
| `Events/` | `HealthDegradedEventArgs`, `HealthRecoveredEventArgs` |
| `Events/` | `HealthEventArgs` (base), `HealthDegradedEventArgs`, `HealthRecoveredEventArgs` |

### State machine

Expand Down
31 changes: 3 additions & 28 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,14 @@
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net10.0'">
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.5" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="10.0.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.14" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.14" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.14" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.3" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.3" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>

<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="8.0.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageVersion Include="MinVer" Version="7.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
Expand Down
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,20 @@ foreach (var monitor in provider.GetRequiredService<IEnumerable<IHealthMonitor>>
}
```

**`netstandard2.0` — resolve by name without keyed services:**

Keyed DI is not available on `netstandard2.0`. Filter the `IEnumerable<IHealthMonitor>` by name instead:

```csharp
var monitors = provider.GetRequiredService<IEnumerable<IHealthMonitor>>();
var monitor = monitors.First(m => m.Name == "quote-feed");

monitor.Degraded += (_, e) => Console.WriteLine($"{e.MonitorName}: degraded");
monitor.Recovered += (_, e) => Console.WriteLine($"{e.MonitorName}: recovered");
```

Alternatively, use `DynamicHealthMonitorManager` which requires no DI at all and is fully supported on `netstandard2.0`.

### Sending Heartbeats

```csharp
Expand Down Expand Up @@ -229,6 +243,20 @@ foreach (var monitor in provider.GetRequiredService<IEnumerable<IHealthMonitor>>
}
```

**`netstandard2.0` — 不使用键控服务按名称解析:**

`netstandard2.0` 下不支持键控 DI,可通过 `IEnumerable<IHealthMonitor>` 按名称筛选:

```csharp
var monitors = provider.GetRequiredService<IEnumerable<IHealthMonitor>>();
var monitor = monitors.First(m => m.Name == "quote-feed");

monitor.Degraded += (_, e) => Console.WriteLine($"{e.MonitorName}: 降级");
monitor.Recovered += (_, e) => Console.WriteLine($"{e.MonitorName}: 恢复");
```

也可以使用 `DynamicHealthMonitorManager`,它完全不依赖 DI,在 `netstandard2.0` 上同样可用。

### 发送心跳

```csharp
Expand Down
Loading