orm - 使用工厂进行映射和重构的域模型快照

标签 orm domain-driven-design memento

我已阅读Patterns, Principles and Practices of DDD如果您想完全封装您的领域模型,您可以将其属性设为私有(private)并使用 Memento 模式来读取它们。还有一个示例,存储库获取域模型的快照,然后映射到数据库模型并将其更改保存到数据库。它还从数据库检索数据库模型,将其映射到快照,然后使用工厂模式从快照重建域模型并使用它。

  1. 当您可以将数据库模型映射到域模型而不使用工厂或快照时,我对这里完成了多少工作感到有点困惑。这不是容易多了吗?
  2. 如果我们要按照这本书来,将域模型快照从服务层返回到表示层,然后将其映射到 View 模型,这是正确的方法吗?或者在表示层中创建快照并将其传递到服务层,使用工厂模式在那里重构它,然后将域模型传递到存储库,在存储库中它将再次获取其快照以映射到数据库模型并保存到数据库....

  3. 当您需要使用如此复杂的映射架构时,您能举一些例子吗?

感觉就像您正在编写复杂的代码,而实际上可以更简单地完成它。

更新

如果可以更容易理解我的要求,我可以添加代码示例。 ;)

最佳答案

  1. 存储库的工作只是从持久存储中保存和补充域实体。除此之外的任何设计模式都只是技术细节,通常是解决 ORM 缺陷的一种方法 - 但它本身并不是存储库(即 DDD 的基本存储方式)的一部分。

    我认为该书中的 Memento 模式用于解决“ORM/封装冲突”,即 ORM 需要对实体的所有字段进行写访问才能重新水化它,这迫使您公开它们并破坏它们封装。

  2. 不,备忘录或快照仅用于持久性目的。服务(或应用程序)层从真实实体进行映射,或者如果您使用 CQRS,则使用预先计算的读取特定模型。

关于orm - 使用工厂进行映射和重构的域模型快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38954434/

相关文章:

logging - DDD。域模型和日志记录

java - 实现可撤消命令 - Java

orm - ORM 和 ORDBMS 有什么区别?

php - 如何使用 Propel ORM 来 Zend Framework

c# - 创建可重用库的技巧

c# - `EqualOperator()` 和 `NotEqualOperator()` 方法如何在此 `ValueObject` 实现中工作(Microsoft 文档)?

mysql - 如何在与sequ​​elize Node 的关系上使用having子句

oop - DDD - 应如何设计域规则,以便上层知道规则何时被破坏?

java - 其中哪一个是 Memento 设计模式的正确实现?

oop - DTO 模式与 Memento 模式