【问题标题】:Map two aggregates inside one Model DDD .NET Core在一个 Model DDD .NET Core 中映射两个聚合
【发布时间】:2019-04-04 14:41:45
【问题描述】:

我是领域驱动设计主题的新手,并且使用 .NET Core 和 Angular 7 创建了一个应用程序。

我有这种情况:

我有一个包含实体和聚合的域层,我有两个聚合:帖子、评论

每一个都有自己的Repository和自己的Model,会分别保存在数据库中Infrastructure层的两张表中。

我现在想在前端显示帖子时遇到问题。我不想发送两个请求来获取帖子,然后是 cmets。相反,我想在一个请求中同时获取它们,这意味着我的聚合应该相互连接,或者我应该创建新的聚合并在其中映射两个模型。

最好的做法是什么?我应该创建一个新模型,例如,PublicPost 并在其中映射两个对象吗?有没有办法使用 DI 和 AutoMapper 动态地实现这一点?谢谢

【问题讨论】:

    标签: asp.net-core entity domain-driven-design aggregate


    【解决方案1】:

    您似乎只是在从每个实体中创建一个“聚合”。这不是它应该如何工作的。您的聚合是域模型。其他相关实体只能通过该聚合访问和使用。

    在这种情况下。你的聚合是PostComment 不是聚合。它属于Post,因此是Post 聚合的一部分。换句话说,在您的 Post 模型上,您应该有如下方法:AddCommentUpdateCommentDeleteComment,并且您将公开一个 Comments 只读列表属性以获取所有 cmets。

    即使Comment 本身就是一个聚合(即它可以完全独立存在,而不与其他任何东西相关联),那么您也将进入有界上下文的领域。 Comment 聚合与 Post 上下文中的“评论”不同(即使它们最终归结为相同的实体类型。您需要一个域,其中 Post 是聚合,@ 987654334@ 通过它和一个完全独立的域进行管理,其中Comment 是其自身的聚合,与Post 完全无关。

    【讨论】:

    • 但是在这种情况下,当我们有大量数据时,我们会在数据库中遇到性能问题,让我们以投票给可能有 100 万条记录的帖子为例。此外,cmet 将单独管理。这意味着当用户添加评论时,我不需要从数据库中取出问题,将 cmets 添加到列表中,然后将其保存,而不是针对评论表。我读到必须聚合根实体:DomainEntity、SqlEntity 和自动映射器将在它们之间进行映射,但在这种情况下我们有双重实体。
    • 嗯,我现在阅读了您的编辑!只是为了理解,您在帖子中的评论是 GetOnly,而 cmets 作为一个聚合来管理它。
    • 后者。每个聚合的回购。
    • 还有一件事。如果您最终需要在不同的有界上下文中管理同一个实体,那么您将需要一个同步策略,例如具有最终一致性的事件溯源等。否则,您的数据将一团糟。
    • @SamySammour 让我们为一个可能有 100 万条记录的帖子投票。此外,cmets 将单独管理 DDD 新手的常见错误。您将持久性问题带入您的域,这会导致抽象泄漏。在设计域模型时应该永远考虑到持久性(这比您想象的要难)。即域模型不应该有Id 字段/属性,只是为了你的RDBMS。其他持久性系统(文档 DB、xml 或 json 存储)可能不需要这些字段,因为它们没有外键关系概念
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2011-05-26
    • 2020-08-15
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多