Table of Contents

DI registration — System Clock stack

Confirms what AddPrimeClock registers in a Microsoft DI container for the KZDev.SystemClock.PrimeTime package and that IPrimeClock and IPrimeTime resolve to the same singleton instance.

ServiceCollection services = [];
services.AddPrimeClock();

using ServiceProvider serviceProvider = services.BuildServiceProvider();

IPrimeClock primeClock = serviceProvider.GetRequiredService<IPrimeClock>();
IPrimeTime primeTime = serviceProvider.GetRequiredService<IPrimeTime>();
TimeProvider timeProvider = serviceProvider.GetRequiredService<TimeProvider>();

ScenarioConsole.WriteLine($"IPrimeClock: {primeClock.GetType().Name}");
ScenarioConsole.WriteLine($"IPrimeTime resolves same singleton: {ReferenceEquals(primeClock, primeTime)}");
ScenarioConsole.WriteLine($"TimeProvider registered: {timeProvider.GetType().Name}");

return Task.CompletedTask;

What to notice

  • AddPrimeClock is idempotent for TimeProvider — if you already registered one (for example a fake), AddPrimeClock will not overwrite it.
  • IPrimeTime is registered as a factory that returns the same singleton resolved for IPrimeClock — both abstractions share state.
  • TimeProvider is the BCL clock surface this stack consumes; tests can inject a custom TimeProvider (or use PrimeTestClock) to control time.