[英]CQRS DDD - Commands and Domain Models relationship
我正在尝试使用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
实体类,该实体类包括一个Books集合。
问题1:上面的命令有此Books
属性是类型的Book
。 我的问题是: Commands
项目是否应该直接引用Model项目,以便在CreateNewBookShelfCommand
解析Book
数据类型? 我个人,我认为除CommandHandlers
或其他可能为Cross Cutting的项目外,不允许Contracts
引用其他任何项目。
问题2:那么,在Contracts
项目中复制Book
实体类的一部分并在CreateNewBookShelfCommand
使用它是一种好习惯吗?
这是我为Book
和BookShelf
的Model项目:
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; }
}
我希望我的解释已经足够,如果我需要在此处添加其他信息,请告诉我。
通常,您不会将域模型中的实体用作命令的元素。
从根本上说,命令是消息 ,因此,它们实际上应该是不变的。 您想知道收到的与发送的相同。 用DDD术语,您可能会认为消息是值对象 。
使用域模型中的实体作为命令的内存表示形式的一部分没有任何意义,因为您永远都不应调用任何更改其状态的实体方法。
本质上,命令与数据传输对象的距离比与域模型实体的距离更近。
通常,系统中的所有实体对象都应位于聚合根接口之后,并且传递给该接口的参数是values 。 如果域模型需要一个实体,则可以从提供的值中创建一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.