c# - 在 MVC Controller 中使用命令查询分离原则

标签 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);
}

但是当我重定向到要显示新项目的操作时,我需要知道新创建项目的 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/

相关文章:

c# - 在 C# 中创建 Excel 电子表格 (XLSX) -- 服务器端

c# - 选择投影中的索引

c# - .NET 等同于 Java FileChannel?

cqrs - CQRS 和 CQS 之间的区别

c# - 创建新数据库条目时违反命令查询分离

c# - 在 C# 中使用嵌套列表反序列化 JSON

javascript - 在 SignalR 上定义 jquery 函数

c# - MVC 4 绑定(bind)到子表列表

java - Spring - 将自定义实例传递给构造函数

c# - 如何从 Asp.net MVC 中的 ListBoxFor 选择框返回空列表而不是空列表?