From 3c8a1e37270c736824a724735ad1b58584c26a42 Mon Sep 17 00:00:00 2001 From: hello Date: Sat, 15 Mar 2025 19:30:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=8A=BD=E8=B1=A1=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/helloshop/time-provider.md | 58 ++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/notes/helloshop/time-provider.md b/notes/helloshop/time-provider.md index 07d1550..26c396b 100644 --- a/notes/helloshop/time-provider.md +++ b/notes/helloshop/time-provider.md @@ -1,3 +1,57 @@ -# 在零度框架中使用 TimeProvider 服务 +# 使用 TimeProvider 服务 -## jie \ No newline at end of file +System.TimeProvider 是一种时间抽象,它以 DateTimeOffset 类型的形式提供时间点。 通过使用 TimeProvider,可确保代码可测试且可预测。 TimeProvider 已在 .NET 8 中引入。 + +## 默认实现 + +默认情况下,TimeProvider 使用 DateTimeOffset.UtcNow 作为时间源。 + +```csharp +Console.WriteLine($"Local: {TimeProvider.System.GetLocalNow()}"); +Console.WriteLine($"Utc: {TimeProvider.System.GetUtcNow()}"); +``` + +## 自定义实现 + +```csharp +public class CustomTimeProvider: TimeProvider +{ + public override DateTimeOffset GetUtcNow() => DateTimeOffset.UtcNow.AddHours(1); +} +``` + +```csharp +builder.Services.AddSingleton(TimeProvider.System); +``` + +```csharp +public class MyService +{ + private readonly TimeProvider _timeProvider; + + public MyService(TimeProvider timeProvider) + { + _timeProvider = timeProvider; + } + + public void DoSomething() + { + var now = _timeProvider.Now; + Console.WriteLine(now); + } +} +``` + +## FakeTimeProvider 实现 + +```powershell +dotnet add package Microsoft.Extensions.TimeProvider.Testing +``` + +```csharp +FakeTimeProvider fakeTimeProvider = new(); +fakeTimeProvider.SetUtcNow(fakeTimeProvider.GetUtcNow().AddHours(1)); + +MyService service = new (timeProvider); +service.DoSomething(); +``` \ No newline at end of file