我喜欢 Command Query Separation 的想法但看不到如何在添加实体的 MVC Controller 操作中使用它,并且在添加后需要新实体的 ID。
例如,在下面的简化示例中,服务用于创建新项目:
public ActionResult Assign(AssignViewModel viewModel)
{
var newItem = _AssignItemService.AssignItem(viewModel.ItemName, viewModel.ItemValue);
return RedirectToAction("ListItem", new {id = newItem.Id);
}
但是当我重定向到要显示新项目的操作时,我需要知道新创建项目的 ID,以便可以从数据库中检索它。所以我必须要求服务返回新创建的项目(或者至少,它的 ID)。
在纯 CQS 中,命令没有返回值,因此上述模式无效。
非常感谢收到的任何建议。
最佳答案
我认为你被困在了一个迂腐的观点上。
查询是指您想向数据库询问一个问题,例如“密西西比河以西有多少客户在 6 月份购买了红色商品?”这就是查询。在插入期间返回 ID 本身并不是典型的查询。
与软件开发中的大多数其他事物一样,这种模式不是绝对的。即使是 Fowler 也表示他愿意在方便的时候打破它:
Popping a stack is a good example of a modifier that modifies state. Meyer correctly says that you can avoid having this method, but it is a useful idiom. So I prefer to follow this principle when I can, but I'm prepared to break it to get my pop.
如果你真的想从数据库中检索最近添加的 ID 与其插入分开,你可以使用类似 Scope Identity 的东西.但我认为您是在增加复杂性而没有获得额外好处。
关于c# - 在 MVC Controller 中使用命令查询分离原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10433769/