Question

I have been reading about Command Query Responsibility Segregation (CQRS). I sort of wonder how would this work with ASP.NET MVC? I get the idea of CQRS conceptually it sounds nice and sure does introduce some complexities (event and messaging pattern) compared to the "normal/common" approach . Also the idea of CQRS sort of against the use of ORM in some ways. I am trying to think how I could use this pattern in the coming projects so if anyone has experience in combining CQRS with ASP.NET MVC and NHibernate please give some concrete examples to help me better understand CQRS and use with ASP.NET MVC. Thanks!

Updated: I've been going through Mark's sample code. It's a must read if you are learning 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/

Was it helpful?

Solution

Cqrs makes the web project much easier. On the get site, all the queries will look like "select * from table where id = @id"). For those simple queries, you won't need an orm like NHiberante. You don't have to use a sql database, and when you will, you can serialize your object to the database table, or use a naming convention. You can still query the read database by NHibernate, but you won't get any advantage from it, because all your queries will be the same.

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

On the command side, the controllers will look like this:

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

The controller just send a message, and it doesn't know where the message goes to and what the result of the message is. The mvc part of this is very simple to program. Cqrs will make writing the web-part of the application very boring, but you can make it more fun by adding some code that helps the user make decisions (optionally returning json used by ajax).

OTHER TIPS

Please take a look at my DDDsample.Net project on CodePlex. The GUI is implemented using ASP.NET MVC while the business logic using DDD practices in 4 different variants:

  • classic (no CQRS)
  • CQRS with two NHIbernate relational data stores
  • CQRS with LINQ to SQL on reporting side
  • CQRS with Event Sourcing on command side

And take a look at my attempt at http://agrcqrs.codeplex.com, which is ASP.NET MVC + NHibernate

Here is a complete example I wrote for my CQRS lib Scritchy:

Creating your CQRS app using the Scritchy nuget package is pretty straightforward and gets you up and running in a few minutes

In the following post you may find interesting resources: How to adapt CQRS to projects

The one that I found particularly interesting is the CQRS Journey, from Microsoft. It may look disappointing for its dependency with Windows Azure, but wait... It has a very nice implementation of an Event Store and Enterprise Service Bus in SQL Server. You will find a lot of comments in the Demo App source code that warns you against using the SQL implementation in production... but with a few tweaks you can adapt it to your project. I did it, and it works very, very well.

The code is clean (it is from the guys from Microsoft Patterns and practices). You will find a good example of how to use dependency injection (with Unity), an simple but effective Enterprise Service Bus (with SQL Server and ADO.NET, with parallel threads), a read model with Entity Framework and a lot more. I learned from it how to do CQRS and Event Sourcing... Remember: Its all about Events

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top