如果您构建的系统的业务流程取决于现在的时间[1],则您不能在代码中使用 DateTime.Now
或类似内容,因为您将拥有处理测试,例如 future 的月末或年末场景。当您使用 SSL 证书时,更改操作系统时间通常不是一个选项,因为对于分布式系统来说,更改操作系统时间很复杂。
一个选项是创建一个返回当前时间的所有系统都可以访问的单例服务。在生产环境中,它可以返回 DateTime.Now
,在测试中,它可以在 End Of Month 场景中返回游戏时间,例如 2 月 28 日。
但是有更好的方法吗?喜欢更面向数据库的方法,因为它会带来更好的性能?或者你会放入分布式缓存吗?是否有一些众所周知的设计模式?
[1] 典型示例:保险系统、核心银行系统、......实现的业务流程
最佳答案
处理此问题的一种方法是使用 clock interface :
public interface IClock {
DateTime Now { get; }
}
并在整个代码中使用此接口(interface),代替 DateTime.Now
。在生产中,您将使用其规范实现(或 UTC 变体):
public class SystemClock implements IClock {
public DateTime Now { get { return DateTime.Now; } }
}
例如,您可以在所有需要 IClock
的类中使用 SystemClock
作为默认设置,并允许通过构造函数或 setter 注入(inject)其他实现。
在测试中,您可以创建测试实现或使用模拟框架对其进行模拟。
关于c# - 应用程序时间的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379393/