【问题标题】:Should CreatedBy contain only user id if User model is an aggregate root itself?如果用户模型本身是聚合根,CreatedBy 是否应该只包含用户 ID?
【发布时间】:2016-03-06 15:43:37
【问题描述】:

我刚刚启动了一个项目来了解有关 DDD 的更多信息。 这可能是一个愚蠢的问题,但只是想了解有关 DDD 的更多信息。

例如,如果我在这里有 2 个域模型,产品和用户,都是聚合根。在产品中,我有其他状态/属性和 2 个称为“CreatedBy”和“CreatedDate”的状态,假设领域专家告诉我“CreatedBy 和 Date”都是业务领域的一部分。 createdby 必须与 User 模型相关。我在考虑 3 个选项,不知道哪个是正确的。

  1. CreatedBy 仅包含用户 ID。 (public int CreatedBy ...)
  2. CreatedBy 是一个用户对象。 (public User CreatedBy ...)
  3. 如下创建一个值对象调用 MetaData

    class MetaData 
    { 
         public int CreatedBy ...
         public string CreatorName ...
         public string CreatorStatus ...
         public DateTime CreatedDate ...
    }
    

创建/保存产品时,

  • 对于选项 1,我只需要获取当前用户的 UserID 并设置 到我的产品模型
  • 对于选项 2,我将获取当前用户的 UserID 并调用 User 存储库以获取此用户并设置为我的产品模型
  • 对于选项 3,我将获取当前用户的 UserID,构造
    MetaData 对象并设置为我的产品模型。

我不确定哪种方法是正确的,希望我对 DDD 的理解到现在都是正确的......

【问题讨论】:

    标签: c# domain-driven-design


    【解决方案1】:

    ProductUser 具有域关系,即:“产品(总是?)由用户创建”。这可以通过使产品引用用户来实现,最简单的方法是让产品具有 UserId。

    聚合不应重叠,它们是自治的,这就是为什么您只使用 UserId 而不是整个 User。如果您需要组合不同的聚合,那么这暗示着有第三个潜伏着,但您还看不到它。

    【讨论】:

    • 如果我需要在产品详细信息旁边显示创建者详细信息,我将使用应用程序服务来调用产品和用户存储库并将它们映射到所谓的 ViewModel/DTO 中?
    • 可以直接查询db。通常我们使用 CQRS 和 DDD,所以我们已经有了一个可查询的读取模型。
    猜你喜欢
    • 2011-10-29
    • 2020-08-20
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2019-05-31
    • 2021-09-11
    相关资源
    最近更新 更多