同一域模型的多个数据传输对象

时间:2016-11-17 06:02:19

标签: domain-driven-design data-access-layer n-tier-architecture multi-tier

如果根据视图有多个同一对象的表示,如何解决这种情况?

例如,假设您有一个书店。在书店中,您有2个主要的书籍代表:

  1. 在列表中(搜索结果,按类别,作者等浏览...):这是一个紧凑的表示形式,可能有一些聚合,例如NumberOfAuthors和NumberOfRwviews。每个作者和评论都是实体本身保存在数据库中。
  2. DetailsView:在这里你不会有聚合但每个作者的实际值,因为Book有一个属性AuthorsList。
  3. 案例2很清楚,你可以从DB获得并显示它。但是如何解决案例1.如果要减少与DB之间的连接数和有效负载数?因此,如果您不想从数据库中获取所有实际的作者和评论,而只需要2个整数来计算每个作者的数量。

    完全规范化的解决方案将是2,但是1似乎需要一些非规范化或创建2个不同的实体:BusinessDetails和BookCompact在业务层中。

    重要提示:我不是在讨论View DTO,而是从DB中获取不适合Business Layer Book类的数据。

2 个答案:

答案 0 :(得分:0)

对我而言,它听起来像多个查询模型(QM)。 我使用了具有CQRS / ES样式的DDD,因此聚合根根据传入的命令生成事件。对于这些事件,订阅多个QM。所以我根据要求创建了多个“视图” ES(事件采购)具有巨大的力量 - 我可以通过重放存储的事件来引入另一个QM 听起来像管理很多相似甚至重复的数据,但它对我来说很有意义 QM可以并且被优化以包含足够的数据/结构/索引以用于给定目的。这是摆脱“共享数据模型”的出路。我看到“RDMS”中的巨大邪恶就是所有方法。您将永远迷失在管理共享模型的复杂性中 - 就像您一样。

答案 1 :(得分:0)

我的设计结果非常好:

  • domain包中包含@Entity个类,其中包含存储在数据库中的所有必要数据

  • dto包,其中包含将从服务中返回的实体的视图/视图

Dto应该有以实体为参数的构造函数。要更轻松地复制数据,您可以使用BeanUtils.copyProperties(domainClass, dtoClass);

通过这样做,您只共享最少量的信息,并在没有任何功能的对象中返回。