【问题标题】:CQRS DDD - Commands and Domain Models relationshipCQRS DDD - 命令和领域模型的关系
【发布时间】:2019-05-09 06:24:15
【问题描述】:

我正在练习使用 CQRS 和 DDD 尽我所能实施一个项目,并且在构建命令后提出了一个问题。

场景:用户发送命令在系统中创建一个书架,该书架本身也可以包含书籍集合。

命令如下所示:

public class CreateNewBookShelfCommand : ICommand
{
    public long CommandInitiatorId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<Book> Books { get; set; }
}

所有Commands 都位于Contracts 项目中,该项目本身位于Application 解决方案文件夹中。

位于Domain 解决方案文件夹中的Model 项目承载BookShelf 实体类,其中包括书籍集合。

问题 1: 上面的命令具有 Books 属性,其类型为 Book。我的问题是:Commands 项目是否应该直接引用 Model 项目,以便在 CreateNewBookShelfCommand 中解析 Book 数据类型?我自己,我不认为Contracts 可以引用CommandHandlers 以外的任何项目或任何其他可能交叉切割 的项目。

问题 2: 那么,在Contracts 项目中复制部分Book 实体类并在CreateNewBookShelfCommand 中使用它是一种好习惯吗?

这是我为BookBookShelf 准备的模型项目:

public class BookShelf : BaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public BookShelfAccess Access { get; set; }

    public virtual BookShelfOwner Owner { get; set; }
    public long OwnerId { get; set; }

    public ICollection<Book> Books { get; set; }
}

 public class Book : BaseEntity
{
    public string Name { get; set; }
    public DateTime? PublishedAt { get; set; }
    public int NumberOfPublishes { get; set; }

    public virtual BookShelf Shelf { get; set; }
    public long ShelfId { get; set; }
}

我希望我的解释已经足够,如果我应该在这里添加任何其他信息,请告诉我。

【问题讨论】:

  • Book 是什么?聚合根?嵌套实体?价值对象?身份证?
  • Book 是我拥有的一个实体类,它位于模型项目中。而且我不确定是否应该从 Commands 项目中引用 Model 项目。这就是我的问题。

标签: c# domain-driven-design cqrs


【解决方案1】:

通常,您不会将域模型中的实体用作命令的元素。

命令本质上是消息,因此它们确实应该是不可变的。您想知道收到的内容与发送的内容相同。在 DDD 术语中,您可能会将消息视为 值对象

将域模型中的实体用作命令的内存表示的一部分是没有意义的,因为您永远不应该调用任何改变其状态的实体方法。

命令在本质上更接近于数据传输对象,而不是域模型实体。

通常,系统中的所有实体对象都应该存在于聚合根接口之后,并且传递给该接口的参数是。如果域模型需要一个实体,它可以根据提供的值创建一个。

【讨论】:

  • 非常有帮助的答案@VoiceOfUnreason 谢谢。因此,当您说命令实际上是应该是不可变的消息时,我想我实际上应该在代码库中使它们如此,我的意思是,从属性中删除 Setter 并使用构造函数传递值?
  • @VoiceOfUnreason 命令 DTO,不是 DDD 意义上的值对象 :) 值对象可以有行为。
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多