MercanSoftYazılım Teknolojileri Günlüğü
01 Tem 2025

.NET 9.0 ile Gelen TimeProvider Yeniliği: Gerçek Zamanın Ötesinde Zaman Kontrolü

.NET 9.0 sürümü, geliştiricilerin uzun süredir ihtiyaç duyduğu birçok yenilikle birlikte geldi. Bunlardan biri de zamanla ilgili soyutlamalar yapmayı mümkün kılan TimeProvider sınıfıdır. Özellikle birim testleri yaparken DateTime.Now, DateTime.UtcNow veya Task.Delay gibi zamana bağlı işlemler hep sorun yaratmıştır. İşte bu noktada TimeProvider hayat kurtarıyor.

TimeProvider Nedir?

TimeProvider, .NET 9.0 ile gelen ve zamana bağlı işlemleri soyutlamaya yarayan bir altyapıdır. Bu yapı sayesinde;

  • Gerçek zaman (production) ile test zamanı (mock) ayrımı yapılabilir.

  • Task.Delay gibi gecikmeler testlerde simüle edilebilir.

  • Kodun zaman bağımlılığı azaltılır, daha esnek hale gelir.

TimeProvider ile Test Edilebilir Kod Yazımı
Eski Yöntemle Problemli Kod:

public class ReminderService
{
public bool IsTimeToSendReminder(DateTime reminderTime)
{
return DateTime.Now >= reminderTime;
}
}

Bu yöntemle yazılmış kodun test edilmesi zordur çünkü DateTime.Now test sırasında sabit değildir.

 

Yeni Yöntem: TimeProvider ile Esnek Kod :

using System;

public class ReminderService
{
private readonly TimeProvider _timeProvider;

public ReminderService(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}

public bool IsTimeToSendReminder(DateTime reminderTime)
{
return _timeProvider.GetLocalNow().DateTime >= reminderTime;
}
}

TimeProvider ile Unit Test:

using Microsoft.Extensions.Time.Testing;
using Xunit;

public class ReminderServiceTests
{
[Fact]
public void Should_Send_Reminder_If_Time_Has_Passed()
{
var fakeTime = new FakeTimeProvider();
var now = new DateTime(2025, 1, 1, 10, 0, 0);
fakeTime.SetLocalTime(now);

var service = new ReminderService(fakeTime);
var reminderTime = now.AddMinutes(-5);

Assert.True(service.IsTimeToSendReminder(reminderTime));
}
}

Delay İşlemlerinde TimeProvider Kullanımı:

public class TaskScheduler
{
private readonly TimeProvider _timeProvider;

public TaskScheduler(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}

public async Task DoAfterDelay()
{
await _timeProvider.Delay(TimeSpan.FromSeconds(5), CancellationToken.None);
Console.WriteLine("5 saniye geçti!");
}
}

 

Testlerde FakeTimeProvider.Advance(TimeSpan) metodu ile zamanı ileri alarak beklemeden test yapılabilir.

Neden Önemli?

  • Testlerde Thread.Sleep veya Task.Delay gibi gerçek beklemelere son.

  • Zamana bağlı hataların kolay yakalanması.

  • Clean code ve SOLID prensiplerine daha uygun mimari.

 

.NET 9.0 ile birlikte gelen TimeProvider, zamana bağlı işlemleri daha yönetilebilir ve test edilebilir hale getiriyor. Bu özellik sayesinde özellikle büyük kurumsal projelerde daha temiz, daha esnek ve daha sürdürülebilir kodlar yazmak mümkün.

Eğer .NET dünyasında test edilebilir mimari oluşturmak istiyorsanız, TimeProvider sizin için olmazsa olmaz bir araç olacaktır.

 

.Net Core Leave a comment

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir