如何将域模型映射到持久性(ORM)?

How to map domain model to persistent (ORM)?

我正在尝试弄清楚如何将我的领域模型映射到持久性或 ORM (typeorm) 实体。

我使用静态方法(toDomain()、toPersistence())将此映射器作为单独的 class 放在基础设施层中,并在存储库中进行映射。但我不知道如何控制 uuid 的生成,基础设施对于 uuid 的生成来说太晚了。应该在应用层生成吗?

我需要在创建对象之前知道这个 uuid,以便在创建后通过从数据库查询它来检查它。

在我看来,域负责生成 id。这通常可以解决问题。从 DDD 的角度来看,我认为这不是问题。

这是 Scala 中的一个例子:

我曾经在域模型中使用过这种代码:

case class Person(id: PersonId, name: String)

case class PersonId(id: UUID)
object PersonId {
   def generate = PersonId(UUID.randomUUID)
}

// Then you can create a person:
val person = Person(PersonId.generate, "name")

PersonId 是一个值对象。这允许在 UUIDPersonId.

之间进行分隔

思考这个问题的一个很好的方法是聚合或实体对象在任何时间点都不可能是无效的。如果您同意唯一的 identifier 是强制性的才能认为它们有效,那么您必须在实例化对象时立即生成唯一的 ID

不过,您如何生成标识符并不重要。它可以是 UUID、数据库序列,甚至是应用程序方法。重要的是 ID 在初始化期间生成并与对象相关联。

您在基础设施层中使用 toDomain()toPersistence() 方法是正确的。