2013-09-06 1 views
2

У меня есть ситуация в проекте CQRS, где я должен регистрировать запрос пользователя для информации (запроса), а затем, при необходимости, запускать рабочий процесс на основе ответа из хранилища данных. Пользователь делает запрос на получение информации, которая требует немедленной обратной связи. В то же время система дополнительно запускает рабочий процесс для анализа запроса. Как это реализовать в CQRS, поскольку запрос не является «чистым» запросом или «чистой» командой?CQRS - Как обрабатывать запросы, которые меняют состояние системы

Edit: Чтобы добавить некоторый контекст к этому: Приложение как приложения поиска, где пользователь вводит запрос и возвращает приложение с результатом. Но приложение также регистрирует запрос и может запускать рабочий процесс в зависимости от ответа с сервера. Приложение также «запоминает» последние несколько запросов пользователя и использует его для предоставления контекста новому запросу.

Кроме того, ответ запроса может быть несинхронным. Фоновый работник может нести ответственность за доставку результата клиенту.

+0

В каком состоянии изменяется запрос? Вы имеете в виду, что рабочий процесс, начинающийся в принципе, внесет изменения? Возможно ли запустить рабочий процесс асинхронно? – Hippoom

+0

Да, Hippoom, запрос изменяет состояние системы через рабочий процесс. – Tolu

ответ

0

Хотя вы дали нам немного работать с Я думаю, что этот вопрос имеет простой ответ:

Я не согласен с вами, что запрос не является ни «чистый» запрос, ни команда «чистой». Запрос является чистым запросом, потому что запрос не является запросом для анализа, а запросом информации. Анализ, который по желанию запускается запросом, представляет собой команду, но команду в контексте события запроса. Таким образом, система, или, более конкретно, обработчик событий, является актером в контексте команды, а не пользователем, который является актером в контексте запроса.

Никакого запроса никогда не бывает побочным эффектом. Это намерение делает запрос.

+0

К моим деньгам: «Никакой запрос никогда не бывает побочным эффектом. Это намерение делает его запросом». это очень дорогостоящий подход, в конечном счете. После нескольких переходов в команде разработчиков никто не запомнит, что такое «намерение» сообщения. –

+0

Хорошее программное обеспечение раскрывает свое намерение. Выборочный запрос в базе данных может также заставить механизм базы данных начать анализ своего кеша, добавить его журналы и обновить некоторые показатели. Он по-прежнему остается запросом. Намерение слова «выбрать» кристально ясно. –

+0

@mrhobo Я добавил еще некоторую контекстуальную информацию к вопросу. Я также не понимаю, что вы понимаете под словом «Без запроса никогда не бывает побочного эффекта ...». Не является ли простой запрос к хранилищу данных возвратом некоторого эффекта на стороне данных, свободного от точки зрения приложения? – Tolu

0

Такой запрос command.

В простом ООП я часто моделировал такое сообщение как метод void с параметрами out.

Например, в финансовой модели, у меня был консультативный контракт (сущность и совокупный корень) принуждая правила строить финансовые рекомендации (сущность, неизменная). Pubblication дефинитивной recommentation был смоделирован с помощью команды, как это:

public interface IAdvisoryContract 
{ 
    ContractNumber Number { get; } 

    // lot of well documented commands and queries here... 

    /// 90 lines of documentation here... 
    void PublishRecommendation(
       IUser advisor, IAssetClassBreakdownAnalysis assetClassAnalysis, 
       IVolatilityAnalysis tevAnalysis, Time time, 
       out IRecommendation newRecommendation); 

    event EventHandler<EventArgs<RecommendationNumber>> RecommendationPublished; 
} 

В CQRS это зависит от инфраструктуры: например, в аналогичной ситуации по HTTP, я использовал POST возвращая соответствующую информацию клиента ,

+0

Просто для любопытства, можете ли вы обновить простой пример? Я имею в виду, что это хорошая идея оставить метод команды недействительным, но в каких ситуациях нам это нужно? – Hippoom

+0

Добавлен пример: объект, который создает новую сущность, чей жизненный цикл отделен от «матери» впоследствии. –

+0

Я добавил еще несколько контекстуальных данных к вопросу. – Tolu

0

Как насчет после выполнения запроса отправить сообщение для уведомления? Я, вероятно, буду использовать декоратор, такой как:

public QueryRs query(QueryRq rq) { 
    final QueryRs rs = target.query(rq); 
    notifier.notifyQueryDone(rs); 
} 

И сделайте рабочий процесс подписанием и употреблением сообщения. Я не уверен, что этот запрос считается изменением состояния в этом решении?

+0

Мой ответ аналогичен только в абстрактных терминах. Ответ - это событие, которое может вызвать команду. Поскольку эта команда не относится к контексту запроса, но является просто побочным эффектом, запрос по-прежнему остается чистым. –