Cómo ordenar la Segregación de Responsabilidad de Consulta (CQRS) con ASP.NET ¿MVC?


He estado leyendo sobre Segregación de Responsabilidad de Consulta de Comandos (CQRS). Me pregunto cómo funcionaría esto con ASP.NET ¿MVC? Tengo la idea de CQRS conceptualmente suena bien y seguro que introduce algunas complejidades (evento y patrón de mensajería) en comparación con el enfoque "normal/común". También la idea de CQRS de alguna manera contra el uso de OR. Estoy tratando de pensar cómo podría usar este patrón en los próximos proyectos para que si alguien tiene experiencia en la combinación CQRS con ASP.NET MVC y NHibernate por favor dar algunos ejemplos concretos para ayudarme a entender mejor CQRS y utilizar con ASP.NET MVC. ¡Gracias!

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 /

Author: Marijn, 2010-03-08

5 answers

Cqrs hace que el proyecto web sea 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ás un or como NHiberante. No tiene que usar una base de datos sql, y cuando lo haga, puede serializar su objeto en la tabla de la base de datos o usar una convención de nomenclatura. Aún 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);
  }
}

El en el lado del comando, los controladores se verán así:

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 simplemente envía un mensaje, y no sabe a dónde va el mensaje ni cuál es el resultado del mensaje. La parte 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 devolviendo json utilizado por ajax).

 18
Author: Paco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-16 23:07:42

Por favor, echa un vistazo a mi DDDsample.Net proyecto en CodePlex. La GUI se implementa usando 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 el lado de informes
  • CQRS con aprovisionamiento de eventos en el lado del comando
 25
Author: Szymon Pobiega,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-18 08:53:07

Y echar un vistazo a mi intento http://agrcqrs.codeplex.com, que es ASP.NET MVC + NHibernate

 4
Author: Jan Willem B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-13 18:29:43

Aquí hay un ejemplo completo que escribí para mi CQRS lib Scritchy :

Creando su aplicación CQRS usando el Scritchy nuget package es bastante sencillo y te pone en marcha en pocos minutos

 0
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-07 12:39:50

En el siguiente post puedes encontrar recursos interesantes: Cómo adaptar CQRS a proyectos

El que me pareció particularmente interesante es el CQRS Journey, de Microsoft. Puede parecer decepcionante por su dependencia con Windows Azure, pero espere... Tiene una implementación muy agradable de una Tienda de Eventos y un Bus de Servicio Empresarial en SQL Server. Encontrará muchos comentarios en el código fuente de la aplicación de demostración que le advierte contra el uso de la implementación SQL en producción... pero con unos cuantos retoques puedes adaptarlo a tu proyecto. Yo lo hice y funciona muy, muy bien.

El código está limpio (es de los chicos de Patrones y prácticas de Microsoft). Encontrará un buen ejemplo de cómo usar dependency injection (con Unity), un bus de servicio Empresarial simple pero efectivo (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 Abastecimiento de eventos... Recuerde: Su todo sobre Events

 0
Author: Narvalex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:39