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

Jef*_*eff 33 nhibernate asp.net-mvc 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/

Szy*_*ega 25

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

  • 经典(没有CQRS)
  • CQRS具有两个NHIbernate关系数据存储
  • 在报告方面使用LINQ to SQL的CQRS
  • CQRS在命令端使用事件源


Pac*_*aco 18

Cqrs使Web项目更容易.在get网站上,所有查询看起来都像"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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 它看起来很简单,因为您不关心命令结果,您应该关心任何系统中的失败命令.对代码不负责任总是让它变得更容易. (11认同)