【发布时间】:2018-11-27 05:28:54
【问题描述】:
创建只包含对象的命令有意义吗?例如:
public class CreateCommand : IRequest
{
SomeDTO SomeDTO { get; set; }
}
public class UpdateCommand : IRequest
{
SomeDTO SomeDTO { get; set; }
}
或者可能是这样的(推导):
public class UpdateCommand : SomeDTO, IRequest
{
}
或者命令/请求本身应该被视为 DTO?我很困惑,因为我看到了很多做事的方法。将所有属性复制到命令/请求类听起来也不是一件好事。
您如何在您的项目中做到这一点?
您是直接将您的命令映射到您的域模型还是使用命令只是为了传递 DTO?
如果使用 MVC 框架,我的控制器操作的输入应该是什么?它应该是一个命令,还是应该在我的操作实现中创建命令并发送它? (我想这将取决于我如何建模我的命令)
【问题讨论】:
-
该命令应该代表读/写操作的合约。由于可能需要多个属性来表示命令和关注的隔离,我更喜欢第一个选项(命令持有对象)。命令和请求应被视为将数据从客户端发送到服务器的合同,反之亦然。 DTO(就数据库而言)应该不同于命令并映射到模型/实体。 (所有这些类比都是基于我的偏好)
-
虽然应用于基本聚合的一些(少数)命令可能与 DTO 有很多相似之处(例如,
CreateHouseCommand可能具有具有大部分House属性的有效负载),但大多数命令的重量应该比完整的House域模型轻得多,例如PaintHouse(colour: blue)和像OpenDoor这样的命令可能根本没有额外的有效载荷。将完整的House模型用作像PaintHouse和OpenDoor这样的命令的命令负载是没有意义的。 -
@StuartLC 感谢您的示例 :)
标签: c# domain-driven-design cqrs dto mediatr