【发布时间】: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 中使用它是一种好习惯吗?
这是我为Book 和BookShelf 准备的模型项目:
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