2010-03-08 8 views
33

He estado leyendo acerca de Command Query Responsibility Segregation (CQRS). Me pregunto cómo funcionaría esto con ASP.NET MVC. Me da la idea de CQRS conceptualmente suena bien y seguro que introduce algunas complejidades (patrón de eventos y mensajes) en comparación con el enfoque "normal/común". También la idea de CQRS es de alguna manera contraria al uso de ORM. Estoy tratando de pensar cómo podría usar este patrón en los próximos proyectos, así que si alguien tiene experiencia en combinar CQRS con ASP.NET MVC y NHibernate, por favor brinde ejemplos concretos que me ayuden a comprender mejor CQRS y utilizar con ASP.NET MVC. ¡Gracias!Cómo controlar la segregación de responsabilidad de consulta (CQRS) con ASP.NET MVC?

Actualizado: He estado revisando el código de muestra de Mark. Es una lectura obligada si estás aprendiendo 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/

Respuesta

18

CQRS hace que el proyecto web mucho más fácil. En el sitio get, todas las consultas se verán como "select * from table where id = @id"). Para esas consultas simples, no necesitará un orm como NHiberante. No tiene que usar una base de datos sql, y cuando lo desee, puede serializar su objeto a la tabla de la base de datos, o usar una convención de nomenclatura. Todavía puede consultar la base de datos leída por NHibernate, pero no obtendrá ninguna ventaja de ella, porque todas sus consultas serán las mismas.

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

En el lado de comandos, los controladores van a tener este aspecto:

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

El controlador acaba de enviar un mensaje, y no sabe dónde está el mensaje va a y lo que el resultado de la mensaje es. La parte de mvc de esto es muy simple de programar. Cqrs hará que escribir la parte web de la aplicación sea muy aburrido, pero puede hacerlo más divertido agregando algún código que ayude al usuario a tomar decisiones (opcionalmente, devolver json utilizado por ajax).

+11

Parece simple porque no le importa el resultado del comando, y debe preocuparse por los comandos fallidos en cualquier sistema. No tener responsabilidad por el código siempre lo hace más fácil. –

25

favor, eche un vistazo a mi proyecto DDDsample.Net en CodePlex. La GUI se implementa utilizando ASP.NET MVC mientras que la lógica de negocio utilizando prácticas DDD en 4 variantes diferentes:

  • clásico (sin CQRS)
  • CQRS con dos almacenes de datos relacionales Nhibernate
  • CQRS con LINQ a SQL en informar lado
  • CQRS con evento de abastecimiento en el lado de comandos
+0

¡Gracias por el enlace! – Jeff

0

Aquí está un ejemplo completo que escribí para my CQRS lib Scritchy:

Creación de su aplicación CQRS usando the Scritchy nuget package es bastante sencillo y gets you up and running in a few minutes

0

En el siguiente post se pueden encontrar recursos interesantes: How to adapt CQRS to projects

El que encontré particularmente interesante es el CQRS Journey, de Microsoft. Puede parecer decepcionante por su dependencia con Windows Azure, pero espere ... Tiene una muy buena implementación de un Event Store y Enterprise Service Bus en SQL Server. Encontrará muchos comentarios en el código fuente de la aplicación Demo que le advierte sobre el uso de la implementación de SQL en producción ... pero con algunos ajustes puede adaptarlo a su proyecto. Lo hice, y funciona muy, muy bien.

El código está limpio (es de los chicos de Microsoft Patterns and practices). Encontrará un buen ejemplo de cómo usar la inyección de dependencia (con Unity), un Enterprise Service Bus simple (con SQL Server y ADO.NET, con subprocesos paralelos), un modelo de lectura con Entity Framework y mucho más. Aprendí de él cómo hacer CQRS y Event Sourcing ... Recuerde: todo se trata de Eventos

Cuestiones relacionadas