Я предпочитаю, чтобы классы, использующие время, фактически полагались на интерфейс, например
interface IClock
{
DateTime Now { get; }
}
С конкретной реализацией
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Затем, если вы хотите, вы можете предоставить любые другие часы для тестирования, например
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Могут возникнуть некоторые накладные расходы при предоставлении часов классу, который на них полагается, но это может быть обработано любым количеством решений для внедрения зависимостей (с использованием контейнера Inversion of Control, простого старого конструктора / установщика или даже шаблона статического шлюза). ).
Другие механизмы доставки объекта или метода, которые обеспечивают желаемое время, также работают, но я думаю, что ключевым моментом является недопущение сброса системных часов, так как это только принесет боль на других уровнях.
Кроме того, использование DateTime.Now
и включение его в свои вычисления не просто кажется неправильным - это лишает вас возможности тестировать определенное время, например, если вы обнаруживаете ошибку, которая возникает только около полуночи или по вторникам. Использование текущего времени не позволит вам протестировать эти сценарии. Или, по крайней мере, не когда захотите.