数据映射器在领域驱动设计模式中相互调用

sil*_*ser 2 design-patterns domain-driven-design datamapper

在我的项目中,我使用了领域驱动设计模式。我有各种数据映射器用于持久化我的模型对象。我的一些模型包含其他模型作为属性(例如,模型类 Book 包含一组模型类 Person 作为作者)。

Book
  |->string title
  |->Person[] authors
Run Code Online (Sandbox Code Playgroud)

每个模型都有一个对应的映射器(例如 Book_Mapper、Perspon_Mapper)。

在持久化模型对象时,一个映射器是否可以调用另一个映射器:

例如,当持久化 Book 对象时,我调用

Book_Mapper::Save(Book)
Run Code Online (Sandbox Code Playgroud)

其中调用

Person::Mapper(Person)
Run Code Online (Sandbox Code Playgroud)

对于这本书的每个作者?

eul*_*rfx 5

从 DDD 的角度来看,要解决有关数据映射器的问题,重要的是首先对您的模型进行一些提炼并确定您的聚合、实体和值对象。

假设这Book是一个聚合,aPerson是一个值对象。在这种情况下,没有必要为它创建单独的映射器,Person因为它始终作为Book聚合的一部分持久存在,因此书籍的映射器也应该处理对人的映射。事实上,为个人创建一个单独的映射器可能会令人困惑。

但是Person,如果也是聚合,那么最好Book仅通过 ID 引用作者。在这种情况下,持久化书籍时无需调用人员映射器。