Как командовать разделение ответственности запросов (CQRS) с ASP.NET MVC? - PullRequest
33 голосов
/ 08 марта 2010

Я читал о Разделение ответственности за запросы команд (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/

Ответы [ 5 ]

25 голосов
/ 08 марта 2010

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

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

Cqrs делает веб-проект намного проще. На сайте get все запросы будут выглядеть msgstr "выбрать * из таблицы, где id = @id"). Для этих простых запросов вам не понадобится такая форма, как NHiberante. Вам не нужно использовать базу данных 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);
  }
}

Контроллер просто отправляет сообщение, и он не знает, куда отправляется сообщение и каков результат сообщения. Эта часть программы очень проста в программировании. Cqrs сделает написание веб-части приложения очень скучным, но вы можете сделать его более увлекательным, добавив некоторый код, который помогает пользователю принимать решения (необязательно возвращая json, используемый ajax).

4 голосов
/ 13 марта 2010

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

0 голосов
/ 06 января 2015

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

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

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

0 голосов
/ 07 ноября 2011

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

Создание приложения CQRS с использованием пакета Scritchy nuget довольно просто, а запускает вас в течение нескольких минут

...