2010-03-08 25 views
33

我一直在阅读有关Command Query Responsibility Segregation (CQRS)。我有点想知道这将如何与ASP.NET MVC的工作?从概念上讲,我认为CQRS的概念听起来不错,而且肯定会引入一些复杂性(事件和消息传递模式)与“正常/常见”方法相比。此外,CQRS的思想在某些方面反对使用ORM。我想如何在即将到来的项目中使用这种模式,所以如果任何人有将CQRS与ASP.NET MVC和NHibernate结合的经验,请给出一些具体的例子来帮助我更好地理解CQRS并用于ASP.NET MVC。谢谢!如何使用ASP.NET MVC命令查询责任隔离(CQRS)?

更新: 我一直在经历马克的示例代码。如果你正在学习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/

回答

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部分非常无聊,但通过添加一些帮助用户做出决定的代码(可选地返回由jjax使用的json),您可以使它变得更有趣。

+11

它看起来很简单,因为你不关心你的命令结果,你应该关心任何系统中的失败命令。对代码没有任何责任总是使它更容易。 – 2012-04-20 08:18:23

25

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

  • 经典(无CQRS)
  • CQRS两个NHibernate的关系数据存储
  • CQRS与LINQ到SQL对命令侧报表方面
  • CQRS与事件采购
+0

感谢您的链接! – Jeff 2010-03-14 22:24:14

0

在下面的帖子你可能会感兴趣的资源:How to adapt CQRS to projects

的一个,我发现特别有趣的是CQRS Journey,从微软。它对Windows Azure的依赖性看起来可能会让人失望,但请等待......它在SQL Server中有一个很好的Event Store和Enterprise Service Bus实现。您会在Demo App源代码中发现很多评论,警告您不要在生产环境中使用SQL实现......但只需稍作调整即可将其应用于您的项目。我做到了,而且非常好。代码是干净的(它来自微软模式和实践的家伙)。你会发现一个很好的例子,说明如何使用依赖注入(使用Unity),简单而有效的企业服务总线(使用SQL Server和ADO.NET,并行线程),使用Entity Framework的读取模型等等。我从中学到了如何做CQRS和事件采购......请记住:关于事件