Как управлять разделением ответственности за запросы (CQRS) с помощью ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/2400967

Вопрос

Я читал о Разделение ответственности за выполнение командных запросов (CQRS).Мне как бы интересно, как это будет работать с ASP.NET MVC?Я понимаю идею CQRS, концептуально это звучит красиво и, несомненно, вносит некоторые сложности (шаблон событий и обмена сообщениями) по сравнению с "обычным" подходом.Также идея CQRS в некотором роде противоречит использованию ORM.Я пытаюсь придумать, как я мог бы использовать этот шаблон в предстоящих проектах, поэтому, если у кого-нибудь есть опыт в объединении CQRS с ASP.NET MVC и NHibernate пожалуйста, приведите несколько конкретных примеров, которые помогут мне лучше понять CQRS и использовать с ASP.NET MVC.Спасибо!

Обновленный:Я просматривал пример кода Марка.Это обязательное чтение, если вы изучаете 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/

Это было полезно?

Решение

Cqrs значительно упрощает веб-проект.На сайте get все запросы будут выглядеть следующим образом "выбрать * из таблицы, где id = @id").Для этих простых запросов вам не понадобится orm, такой как NHiberante.Вам не обязательно использовать базу данных sql, и когда вы это сделаете, вы можете сериализовать свой объект в таблицу базы данных или использовать соглашение об именовании.Вы все еще можете запросить базу данных read с помощью 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 сделает написание веб-части приложения очень скучным, но вы можете сделать его более увлекательным, добавив некоторый код, который помогает пользователю принимать решения (необязательно возвращая json, используемый ajax).

Другие советы

Пожалуйста, взгляните на мой DDDsample.Net проект на CodePlex.Графический интерфейс реализован с использованием ASP.NET MVC, а бизнес-логика с использованием методов DDD в 4 различных вариантах:

  • классический (без CQRS)
  • CQRS с двумя реляционными хранилищами данных NHIbernate
  • CQRS с LINQ to SQL на стороне отчетности
  • CQRS с источником событий на стороне команды

И взгляните на мою попытку http://agrcqrs.codeplex.com, то есть ASP.NET MVC + NHibernate.

Вот полный пример, который я написал для моя библиотека CQRS Scritchy:

Создание приложения CQRS с использованием пакет Nuget Scritchy довольно просто и поможет вам приступить к работе за несколько минут

В следующем посте вы можете найти интересные ресурсы: Как адаптировать CQRS к проектам

Особенно интересным мне показался CQRS-путешествие, от Microsoft.Его зависимость от Windows Azure может показаться разочаровывающей, но подождите...Он имеет очень хорошую реализацию хранилища событий и корпоративной сервисной шины в SQL Server.В исходном коде демонстрационного приложения вы найдете множество комментариев, которые предостерегают вас от использования реализации SQL в производстве...но с помощью нескольких настроек вы можете адаптировать его к своему проекту.Я сделал это, и это работает очень, очень хорошо.

Код чистый (он от ребят из Microsoft Patterns and Practices).Вы найдете хороший пример использования внедрения зависимостей (с Unity), простой, но эффективной Enterprise Service Bus (с SQL Server и ADO.NET, с параллельными потоками), модели чтения с Entity Framework и многого другого.Из него я узнал, как использовать CQRS и источник событий...Помнить:Все дело в событиях

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top