最近我在域模型中遇到了以下不变量:
如果ExpiryAt(DateTimeOffset)< DateTimeOffset.Now,则将Offer视为已过期。
公司的董事不能年龄小于18岁。
下载文档时,我们应该使用DateTimeOffset.Now设置DownloadedAt字段。
在应用程序层中,为了保持纯洁性和更好的测试,我们通常使用IDateTime接口隔离System.DateTime,这样可以在单元测试中模拟Now。
但是所有这些3种情况都属于域层,而不是应用程序层。我们不应该将外部接口注入DomainModel以保持其纯洁性。但从另一方面来说,在DomainLayer中直接使用DateTime.Now或DateTimeOffset.Now可能是不好的,因为这会添加对系统时钟的依赖,并有时会使测试更加困难,因为DateTime.Now永远不会返回相同的结果。
那么问题是 - 如何解决这个困境?
我看到的选项:
将now作为参数提供给域实体方法。 这是可行的选择,虽然会使代码更冗长,有时甚至很愚蠢,但简化了测试。
在域层中直接使用DateTime.Now。我已经提到了这种方法的缺点。
从您的经验中,还有什么建议吗?