- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我在我的域模型中遇到了以下不变量:
如果 ExpiryAt (DateTimeOffset) < DateTimeOffset.Now,则报价被视为已过期。
公司董事年龄不得小于18岁
下载文档时,我们应该将 DownloadedAt 字段设置为 DateTimeOffset.Now
在应用层中,为了保持纯度和更好的测试,我们通常将 System.DateTime 与 IDateTime 接口(interface)隔离开来,这允许在单元测试中模拟 Now。
但这3个场景都属于领域层,不属于应用层。我们不应该将外部接口(interface)注入(inject) DomainModel 以保持它的纯净。但从另一方面来看,直接在 DomainLayer 中使用 DateTime.Now 或 DateTimeOffset.Now 可能不好,因为这会增加对系统时钟的依赖性,并且有时会更难测试,因为 DateTime.Now 永远不会返回相同的结果。
那么问题是 - 您如何应对这种困境?
我看到的选项:
现在作为域实体方法的参数提供。这是一个可行的选择,可以简化测试,但会使代码更加冗长,有时甚至是愚蠢的。
只需在领域层使用 DateTime.Now。我已经提到了这种方法的缺点。
根据您的经验,您还有什么建议吗?
最佳答案
从不同的选项来看,访问静态DateTime.Now() 功能显然是最不利的。它既不允许测试,也隐藏了域模型对实现细节中某些非确定性基础设施的依赖。
将一些接口(interface)注入(inject)到可以查看的服务的选项要好一些,因为它使依赖显式并且还允许通过对非依赖进行 stub 来进行单元测试- 确定性输出以返回您选择的一些确定性值。
但是,在运行时您的域模型仍然需要访问一些基础设施依赖项。在某些情况下,这可能是一个合理的妥协,但如果可能的话,我会尽量避免这种情况,以保持域模型的纯净。
如果您从不同的角度看您案例中的当前日期时间,您会发现它实际上与普通输入参数完全不同。您可以将其视为类似于引用日期时间,而不是当前日期时间。
引用您的第一个示例 - 检查报价是否已过期 - 从域模型的角度来看,它需要检查报价是否已在某个给定时间点过期 。在执行域逻辑的用例之一中,这个给定时间点恰好是当前日期时间。
所以最重要的是,在这种情况下,我建议注入(inject)(当前)日期时间的值,而不是某些功能的接口(interface)。它明确了除了域自己封装的数据之外真正需要哪些数据以及执行业务逻辑所需的数据。
此外,它使客户端代码(例如用例或应用程序服务)想要告诉或询问域模型的内容更加明确。例如,检查优惠是否已经过期,或者如果需要,告诉我优惠是否已经在给定的时间点过期,或者即使它会在重要的时间点过期。
作为进一步阅读,我推荐这个很棒的 article from Vladimir Khorikov他详细阐述了该主题。
关于domain-driven-design - DDD 领域层中的 DateTime.Now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71179194/
遇到 now() 在 Postgres 中的函数中使用时的行为与“now”不同的问题。 drop table if exists test_date_bug; CREATE TABLE test_da
Google 刚刚发布了一项名为 Now on Tap 的 Google Now 新功能。它使用户能够从不同的应用程序 (The Verge video example) 获得上下文帮助。 是否只是截
performance.now() 和 Date.now() 有什么区别? 我是否应该将 performance.now() 视为 Date.now() 的替代品,因为 performace.now(
需要了解为什么我会得到时差。 这是我的 VBA 代码: Public OHLCArray(1 To 481, 0 To 28, 0 To 3) As Single 'debug stm
假设: rAF now时间是在所有回调集被触发时计算的。因此,在调用该帧的第一个回调之前发生的任何阻塞都不会影响 rAF now它是准确的——至少对于第一次回调来说是这样。 在触发 rAF 集之前进行
在我的程序中,每个表都有一列 last_modified: last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp)
这是 Form1 中的代码: private DateTime dt; [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLa
什么时候应该使用 django 的 timezone.now() 以及什么时候应该使用 python 的 datetime.datetime.now()。 例如,在下面的 INSERT 中哪个更有意义
我正在将我的项目从 Django 1.8.2 升级到 1.9.7,我收到了这个警告: WARNINGS: my_app.my_model.date_available: (fields.W161) F
我应该在我的 Rails 应用程序中使用两者中的哪一个: DateTime.now or Time.now 在应用程序中同时使用两者有什么坏处吗? 在上述 (now) 示例中,两者之间是否存在任何差异
这个问题已经有答案了: Date vs new Date in JavaScript (8 个回答) 已关闭 6 年前。 我更多地谈论添加“new”如何影响变量,为什么/何时使用它,以及为什么我在打印
// Data-Bind is Here // Data-Bind is Here Show
我想做一个查询来检查今天是否有值,如果没有,则显示今天之前最近的条目。 这是我使用的查询: $variable = 'var1'; SELECT * FROM `table` WHERE `somet
我有一个表,其中有一列 event_time。如何选择 NOW() 之前的两行和 NOW() 之后的下一行,按 event_time 排序? 单个查询是否可行? 最佳答案 怎么样 SELECT * F
我如何向 Google Now 提供我的信息或我的应用程序数据卡片?有没有我可以使用的 API? 最佳答案 Google Now API 仅提供给在 Google 注册其应用程序的用户,它一直是私有(
...当我尝试执行如下所示的查询时: Session().query(MyMappedClass).update({MyMappedClass.time:func.now()}) 我得到: Inval
我试图了解 time.Now() 和 time.Now().Local() 之间的区别。我首先在我的笔记本电脑上打印它们(运行 Ubuntu 18.04): fmt.Println(time.Now(
假设我有一个包含三个字段的数据库表:id、内容和时间戳。 全天都会收到参赛作品,因此会有大量参赛作品,并且仍会定期收到参赛作品。 当访问者查看将显示条目的网页时,该页面将显示最近的 10 个条目以及访
我对夏令时处理有点困惑 设置.py: TIME_ZONE = 'Europe/London' USE_TZ = True 在 django shell 中: >>> from django.utils
我正在使用 node.js 和 now.js。一切正常。但我想制作一个可以从命令行运行的简单客户端(因此无需浏览器)。 http://nowjs.com/doc/example 在示例中,提供了一个
我是一名优秀的程序员,十分优秀!