【发布时间】:2022-10-17 05:55:56
【问题描述】:
最近我在我的域模型中遇到了以下不变量:
-
如果 ExpiryAt (DateTimeOffset) < DateTimeOffset.Now,则商品被视为已过期。
-
公司董事不得低于 18 岁
-
下载文档时,我们应该使用 DateTimeOffset.Now 设置 DownloadedAt 字段
在应用程序层中,为了保持纯度和更好的测试,我们通常将 System.DateTime 与 IDateTime 接口隔离,这允许在 UnitTests 中模拟 Now。
但是这三个场景都属于领域层而不是应用层。我们不应该将外部接口注入到 DomainModel 中以保持其纯净。但从另一方面来看,直接在 DomainLayer 中使用 DateTime.Now 或 DateTimeOffset.Now 可能会很糟糕,因为这会增加对系统时钟的依赖,并且有时会更难测试,因为 DateTime.Now 永远不会返回相同的结果。
所以问题是——你如何处理这个困境?
我看到的选项:
-
现在作为参数提供给域实体方法。这是可行的选择并简化了测试,尽管使代码更加冗长,有时甚至是愚蠢的。
-
只需在域层中使用 DateTime.Now。我已经提到了这种方法的缺点。
您还可以根据自己的经验提出其他建议吗?
-
【问题讨论】: