【问题标题】:DDD: Pattern for submitting and approving contractsDDD:提交和批准合同的模式
【发布时间】:2013-05-20 18:24:48
【问题描述】:

我正在开发一个存在以下要求的应用:

  • 用户在表单中提交了一些数据,这些数据将作为“草稿副本”保存下来。
  • 在另一端,审批者阅读并采取一些措施(批准、拒绝等)
  • 如果批准人批准草稿副本,则它成为合同,双方具有法律约束力。原始提交者可以返回并更改草稿副本,然后重新提交。当审批者批准最新版本时,现有合同将替换为新合同。

我正在努力解决的是我们试图在我们的项目中使用 DDD,但没有任何解决方案真正“感觉正确”。我们都对现代 DDD 缺乏经验,因此找到正确的模型非常令人困惑。

这不是文档管理问题。提交者始终只使用一个草稿副本,有时会有任何一方都无法编辑的合同(通过重新提交带有更改的草稿副本来执行编辑)。出于这些目的,这两个领域概念中的字段是相同的。

是否有一些设计模式或 DDD 友好的解决方案可以在这里应用?

【问题讨论】:

  • 现在我们只是在讨论设计选项。我们正在考虑三件事: 将合同附加到 DraftCopy;将 DraftCopy 作为值对象保留在 Contract 中,而不是真正使用任何特定的 DDD 技术,而只是将两个对象与某种公共 ID 相关联。

标签: c# architecture domain-driven-design


【解决方案1】:

我不确定你在这里想要什么,但我建议你应该看看EventSourcing 模式。它对于跟踪域对象的变化非常有用。 关注马丁·福勒:

事件溯源确保对应用程序状态的所有更改都是 存储为一系列事件。我们不仅可以查询这些事件,我们 还可以使用事件日志来重建过去的状态,并作为 基金会自动调整状态以应对追溯 变化。

还有格雷格·杨:

拥有两个模型的另一个问题是 必然更多的工作。必须创建代码以保存当前 对象的状态,必须编写代码来生成和 发布事件。不管你如何去做这些事情 不可能比只发布事件更容易,即使你有 可以说存储当前状态完全微不足道的东西 文档存储,仍然有努力将其带入 项目。

—格雷格·杨-

当用户提交“草稿副本”时,应该引发一个事件并将其存储到EventSourcing。 另一个用户提出另一个“草稿副本”将被EventSourcing 对象捕获并将其标记为新版本。如何使它与众不同,您应该应用 DDD。一个文档对象是一个Domain 对象并且有一个标识符。

Eventsourcing查询和更新每个版本的实体的状态,并取回对象的版本将很容易。

您可以从MSDN 获取更多关于EventSourcing 的参考资料。

希望对您有所帮助。

【讨论】:

  • 谢谢,我们实际上已经计划对所有聚合使用事件溯源,也许这是解决方案的一部分。
  • +1。非常感谢。这是我第一次知道 EventSourcing。
猜你喜欢
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2018-09-02
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多