如何使用ASP.NET MVC命令查询责任分离(CQRS)?

时间:2010-03-08 11:38:58

标签: asp.net-mvc nhibernate orm cqrs

我一直在阅读Command Query Responsibility Segregation (CQRS)。我有点想知道如何使用ASP.NET MVC?我从概念上理解了CQRS,听起来不错,肯定会引入一些复杂性(事件和消息模式)与“普通/常见”方法相比。 CQRS的思想也在某种程度上反对使用ORM。我正在考虑如何在即将到来的项目中使用这种模式,所以如果有人有将CQRS与ASP.NET MVC和NHibernate结合的经验,请提供一些具体的例子来帮助我更好地理解CQRS并与ASP.NET MVC一起使用。谢谢!

更新: 我一直在浏览Mark的示例代码。如果您正在学习CQRS,那必须阅读。

http://github.com/MarkNijhof/Fohjin

http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/

http://cre8ivethought.com/blog/2009/11/28/cqrs-trying-to-make-it-re-usable/

6 个答案:

答案 0 :(得分:25)

请查看我在CodePlex上的DDDsample.Net项目。 GUI使用ASP.NET MVC实现,而业务逻辑使用DDD实践,有4种不同的变体:

  • classic(无CQRS)
  • 具有两个NHIbernate关系数据存储的CQRS
  • CQRS与报告方面的LINQ to SQL
  • CQRS在命令端使用事件采购

答案 1 :(得分:18)

Cqrs使Web项目变得更加容易。在获取网站上,所有查询都将如下所示 “select * from table where id = @id”)。对于那些简单的查询,您不需要像NHiberante这样的orm。您不必使用sql数据库,只要您愿意,您可以将对象序列化到数据库表,或使用命名约定。您仍然可以通过NHibernate查询读取数据库,但是您不会从中获得任何好处,因为您的所有查询都是相同的。

public class Controller
{
  public ActionResult Get(Guid id)
  {
     var viewModel = reportingDatabase.Get(id);
     return View(viewmodel);
  }
}

在命令端,控制器将如下所示:

public class Controller
{
  public ActionResult Post(SomeForm form)
  {
    // do validation
    var command = new SomeCommand(form.Property1, form.Property2);
    bus.Send(command);
    return redirecto(something else);
  }
}

控制器只是发送一条消息,它不知道消息的去向以及消息的结果。 mvc部分的编程非常简单。 Cqrs将使编写应用程序的Web部分非常无聊,但您可以通过添加一些帮助用户做出决策的代码(可选地返回ajax使用的json)来使其更有趣。

答案 2 :(得分:4)

看看我对http://agrcqrs.codeplex.com的尝试,即ASP.NET MVC + NHibernate

答案 3 :(得分:0)

以下是我为my CQRS lib Scritchy撰写的完整示例:

使用the Scritchy nuget package创建CQRS应用非常简单,gets you up and running in a few minutes

答案 4 :(得分:0)

在以下文章中,您可能会找到有趣的资源:How to adapt CQRS to projects

我觉得特别有趣的是来自微软的CQRS Journey。它对Windows Azure的依赖可能看起来令人失望,但等等......它在SQL Server中实现了非常好的事件存储和企业服务总线。您将在演示应用程序源代码中找到许多注释,警告您不要在生产中使用SQL实现......但是通过一些调整,您可以将其调整到您的项目中。我做到了,它非常,非常好。

代码很干净(来自Microsoft模式和实践的人员)。您将找到一个很好的示例,说明如何使用依赖注入(使用Unity),一个简单但有效的企业服务总线(使用SQL Server和ADO.NET,具有并行线程),具有实体框架的读取模型等等。我从中学到了如何进行CQRS和事件采购......记住:关于事件的全部内容

答案 5 :(得分:0)

这是一个较晚的响应,但是对于正在寻找如何在ASP.NET Core中实现CQRS架构模式的人来说可能会有所帮助,并且令人惊讶的是,没有找到合适的中间件来解决此问题。 在发现过程中,我决定分享我的发现,并最终撰写了一系列文章,介绍如何通过HTTP进行CQRS。

  1. CQRS: Intro
  2. CQRS: Commanding via HTTP
  3. CQRS: Querying via HTTP

除理论上的观点外,在撰写过程中,我设法构建了两个易于使用的独立中间件,这些中间件旨在帮助您在ASP NET Core项目中采用CQRS。 HTTP CommandingHTTP Querying

希望有帮助,如果您有任何疑问,请不要犹豫,向我发送消息。