使用MVC控制器中的命令查询分离原则

App*_*ere 6 c# asp.net-mvc command-query-separation

我喜欢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);
}
Run Code Online (Sandbox Code Playgroud)

但是当我重定向到要显示新项目的操作时,我需要知道新创建的项目的ID,以便可以从数据库中检索它.所以我必须要求服务返回新创建的项目(或至少,它的ID).

在纯CQS中,命令没有返回值,因此上面的模式将是无效的.

任何建议都感激不尽.

Rob*_*vey 8

我认为你陷入了迂腐的境地.

查询是指您想向数据库询问一个问题,例如"密西西比河以西有多少客户在六月份购买了红色物品?" 这是一个查询.在插入期间返回ID本身不是典型的查询.

与软件开发中的大多数其他内容一样,这种模式并不是绝对的. 甚至Fowler说他愿意在方便的时候打破它:

弹出堆栈是修改状态的修饰符的一个很好的例子.梅耶正确地说你可以避免使用这种方法,但这是一个有用的习惯用法.所以我喜欢在我可以的时候遵循这个原则,但我准备打破它以获得我的流行音乐.

如果您确实想要从数据库中插入最近添加的ID,则可以使用Scope Identity之类的内容.但我认为你增加复杂性没有额外的好处.


jor*_*hmv 4

您应该向AssignItem方法传递一个从视图模型的值创建的“Item”实例(或任何实体的名称),然后该方法不必返回任何内容,而只会更新实体的 Id 属性,使其成为 Command 方法。

然后你可以使用entity.Id来做任何你想要的事情