Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

  • Example.Domain: Реализация домена
  • Example.Specs: характеристики поведения домена с использованием MSpec
  • Example.Web: Пример веб-приложения MVC (демонстрационный пример http://scritchyExample.apphb.com)
  • Example.SignalR: Пример html/Javascript/SignalR веб-приложение (с использованием того же кода домена)

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

Ответ 5

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

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

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