0

我想使用 Jimmy Nilsson 在他的书Applying DDD with Patterns中提到的一个想法,那就是如果我有一个像Product这样的实体,我想为该实体拍摄历史信息的快照,一些像ProductSnapshot但我想知道如何使用 ORM 来实现它(我目前正在使用实体框架)。我面临的主要问题是,如果我有另一个像OrderLine这样的实体通过其构造函数接收产品,那么实体框架将需要您创建一个您希望保留的类型的公共属性,所以这将迫使我拥有这样的东西:

class OrderLine {
public Product Original Product {get; set;}
public ProductSnapshot Snapshot {get; set;}
}

这看起来很尴尬而且不直观,当涉及到数据绑定(我应该绑定到哪个属性)时,我不知道如何正确处理它,最后我认为Product是一个实体,而ProductSnapshot是一个值对象加上仅当接受OrderLine并且之后不再需要Product时才会拍摄快照。

4

2 回答 2

1

做DDD的时候,忘记数据库存在。这意味着 ORM 也不存在。现在,因为您不必关心持久性和 ORM 限制,您可以根据域需要对 ProductSnapshot 进行建模。

创建一个包含所有必需成员的 ProductSnapshot 类。这个类可能是 SnapshotService.GetSnapshot(Product p) 的结果。获得 ProductSnapshot 后,只需将其发送到存储库 SnapshotsRepository.Save(snapshot) 。作为一个快照,这意味着它可能更像是一个数据结构,一个“哑”的对象。它也应该是不变的,“冻结”。

存储库将使用 EF 实际保存数据。您决定 EF 实体和关系是什么。ProductSnapshot 被持久性认为是一个业务对象(实际上它是否只是一个简单的 Dto 没关系),并且 EF 实体可能看起来非常不同(例如,我将业务对象以序列化形式存储在一个键中 -值表)根据您的查询需要。

定义 EF 实体后,您需要将 ProductSnapshot 映射到它们。ProductSnapshot 本身很可能可以用作 EF 实体,因此您不需要进行任何映射。

关键是,拍摄快照似乎是域行为。仅在获得快照后才处理 EF,并且您的操作与处理任何其他业务对象的方式完全相同。

于 2013-04-15T08:40:14.957 回答
0

为什么 OrderLine 必须具有 ProductSnapshot 属性?我想,如果您需要获取该历史信息,您可以从 Product 类中获得 ProductSnapshot 的链接,或者,如果您只想在某些条件下保存 Product 状态,只需在 Product 部分类中实现 SaveSnapshot 方法,或者有它的扩展方法。

于 2013-04-15T07:07:33.030 回答