c# - 应用程序时间的设计模式?

标签 c# design-patterns testing

如果您构建的系统的业务流程取决于现在的时间[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/

相关文章:

c# - WCF 重用 SAME 库中的类型

c# - 可以在linq中这样做吗?

c# - 如何在项目文件夹中找到不再存在于项目中的 .CS 文件?

design-patterns - 在解决方案中实现业务规则引擎的方法或模式?

design-patterns - 如何设计游戏服务器的通信 channel

python - 如何将数据从类似于/dev/urandom 的 Python PRNG 脚本输出到 Dieharder

c# - 如果查询未返回任何内容,linq 选择项的默认值

oop - 桥接模式——组合还是聚合?

Java JUnit : The method X is ambiguous for type Y

angular - 如何为包含带 Angular 路由器的组件设置测试?