---
title: SAIF.NetCore.PingableService dependencies
summary: Internal and external dependencies for this library.
status: draft
owner: SAIF Platform Team
last_reviewed: 2026-10-02
library: SAIF.NetCore.PingableService
reference_type: package
---

# SAIF.NetCore.PingableService dependencies

SAIF.NetCore.PingableService takes a single internal NuGet package dependency on the foundation layer, `SAIF.NetCore.ServiceContracts`, a small set of Microsoft ASP.NET Core framework packages, and makes no outbound API calls of its own — it exposes only an inbound, hosted `GET /Ping` health endpoint.

## Internal dependencies

| Dependency | Reference Type | Usage |
| --- | --- | --- |
| [SAIF.NetCore.ServiceContracts](../saif-netcore-servicecontracts/overview.md) | NuGet Package (same-repo) | Supplies `ISaifLogService` (optional logger parameter type on `IPingableService`/`PingableController`) and `HttpStatusCodeException`, the base class of `PingServiceException`. |

## External dependencies

| Dependency | Version | Usage |
| --- | --- | --- |
| `Microsoft.Extensions.DependencyInjection` | 3.1.9 | Supplies `IServiceCollection`, `AddTransient/Scoped/Singleton`, and `GetRequiredService`/`GetService(s)` used by the DI-registration extensions and `ControllerRetriever`. |
| `Microsoft.AspNetCore.App` | matches each TFM (`FrameworkReference`) | Supplies `ControllerBase`, `[Route]`, `[ApiController]`, `[HttpGet]`, `[AllowAnonymous]`, `IMvcBuilder`, `ApplicationPartManager`, and `AssemblyPart`. |

## Dependency risks and notes
- This library exposes only an inbound hosted endpoint (`GET /Ping`) and makes no outbound API calls of its own, directly or through an internal library or package; the `## API dependencies` section is omitted because it has no rows to report.
- `SAIF.NetCore.Services.Messaging` consumes this package as one of the three documented implementation-to-implementation exceptions in `Architecture.md` (pinned version `1.3.20302.1`), through the controller-discovery channel only (`BackgroundConsumerServicesController : ControllerBase, IPingableService`) — not through a direct runtime call into this library's implementation code*.
- `SAIF.NetCore.ServiceExtensions` (top layer) consumes this package under Central Package Management at version `10.2026.26267.1`; `BaseApiStartup.ConfigureMvcBuilder` calls `WithPingableController()` for every API that inherits it.
- Version drift exists between consumers: Messaging pins `1.3.20302.1` while ServiceExtensions pins `10.2026.26267.1`. Compatibility between these two versions is unknown — the earlier package's implementation/API surface at `1.3.20302.1` was not inspected, and no cross-version test exercises this version gap; the current (`10.2026.26267.1`) public surface being small is not, by itself, evidence that the older consumer's usage remains compatible.**
- `WithPingableController()` is the supported convenience path for the controller-discovery channel; pairing it with the host calling `AddControllersAsServices()` lets pingable controllers resolve by concrete type. Omitting that pairing, when the host has pingable controllers to discover **and without equivalent concrete-type registrations**, causes the controller-discovery channel to silently resolve `null` and surface as a `PingServiceException` rather than a startup-time failure*. The actual prerequisite is that each discovered pingable controller's concrete type be resolvable from DI by `provider.GetService(type)` — satisfied either by calling `AddControllersAsServices()` (which registers every controller type this way) or by an equivalent explicit DI registration for each pingable controller's concrete type, independent of which registration API supplied it. Plain DI-registered `IPingableService` services need neither call. An equivalent explicit application-part registration plus a direct `IControllerRetriever` registration can satisfy the same prerequisites without `WithPingableController()`.
- Converting a thrown `PingServiceException` into a formatted HTTP 500 response depends on the host having `DynamicErrorHandler` (`SAIF.NetCore.ServiceExtensions`) installed and delegating to its injected `IErrorHandler` (the `ErrorHandler` class, `SAIF.NetCore.ErrorHandler`); this library does not itself reference or depend on either package*.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Operations and processes](operations-processes.md)
- [Business rules](business-rules.md)
- [Security and authorization](security-authorization.md)
- [Service registration](service-registration.md)
- [API reference](api/index.md)
- [SAIF.NetCore.ServiceContracts](../saif-netcore-servicecontracts/overview.md)

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts. Statements marked with `**` could not be confirmed; treat
> as unknown until verified.

## Sources
- `src/SAIF.NetCore.PingableService/SAIF.NetCore.PingableService/SAIF.NetCore.PingableService.csproj`
- `src/SAIF.NetCore.PingableService/SAIF.NetCore.PingableService/Controllers/PingableController.cs`
- `src/SAIF.NetCore.PingableService/SAIF.NetCore.PingableService/Services/ControllerRetriever.cs`
- `src/Messaging/src/SAIF.NetCore.Services.Messaging/SAIF.NetCore.Services.Messaging/SAIF.NetCore.Services.Messaging.csproj`
- `src/SAIF.NetCore.ServiceExtensions/SAIF.NetCore.ServiceExtensions/SAIF.NetCore.ServiceExtensions/Startup/BaseApiStartup.cs`
- `src/SAIF.NetCore.ServiceExtensions/SAIF.NetCore.ServiceExtensions/SAIF.NetCore.ServiceExtensions/Middleware/DynamicErrorHandler.cs`
- `src/SAIF.NetCore.ErrorHandler/SAIF.NetCore.ErrorHandler/SAIF.NetCore.ErrorHandler/ErrorHandler.cs`
- `Architecture.md`
