共用方式為


ISystemClock 已淘汰

自 1.0 版本起,ASP.NET Core 的驗證和身分識別元件已使用 Microsoft.AspNetCore.Authentication.ISystemClock 來啟用與時間相關的功能 (例如過期檢查) 的單元測試。 .NET 8 包含一個適當的抽象概念 (System.TimeProvider),它提供了相同的功能以及更多功能。 我們藉此機會在整個 ASP.NET Core 程式庫中淘汰 ISystemClock,並將它取代為 TimeProvider

導入的版本

ASP.NET Core 8.0 Preview 5

先前的行為

ISystemClock 已透過相依性插入 (DI) 被插入到驗證和身分識別元件的建構函式中,並且可以被覆寫以進行測試。

預設的 SystemClock 實作會截斷到最接近的秒數以便更易於進行格式化。

新的行為

ISystemClockSystemClock 和具有 ISystemClock 參數的驗證處理常式建構函式已標示為已淘汰。 在程式碼中使用這些 API 會在編譯時產生警告。

ISystemClock 會保留在相依性插入容器中,但不再使用。 它可能會在未來版本中從容器中移除。

TimeProvider 現在是驗證和身分識別元件的 Options 類別上的可設定屬性。 您可以直接或在相依性插入容器中註冊提供者來設定它。

TimeProvider 不會截斷到最接近的秒數。 使用者應該根據需要自行正確地格式化時間。

中斷性變更的類型

這項變更會影響來源相容性

變更原因

進行此變更是為了統一整個堆疊上的時間抽象概念,以便於測試。

如果您有從 Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser> 衍生的元件,請移除 ISystemClock 建構函式參數並相應地呼叫新的基本建構函式。

- public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
-     : base(options, logger, encoder, clock)
+ public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder)
+     : base(options, logger, encoder)

同樣地,參考這些類型上的 Clock 屬性的衍生實作應該改為參考新的 TimeProvider 屬性。

- var currentUtc = Clock.UtcNow;
+ var currentUtc = TimeProvider.GetUtcNow();

您可以設定 TimeProvider 以在選項上或透過 DI 進行測試。

受影響的 API