2012-04-12 2 views
1

Я читал, что команды в CQRS предназначены для того, чтобы не терпеть неудачу и должны быть асинхронными по своей природе.CQRS/EventStore - как вы управляете большим деревом, если команда не должна терпеть неудачу?

В моем случае у меня есть дерево (подумайте о проводнике Windows), где у пользователей есть папки, которые представляют местоположения для видеоконтента, а каждый ребенок - видео/мультимедийный файл. Несколько пользователей могут работать в одной ветви дерева, перемещая папки и файлы (загружая новые файлы и создавая новые папки, а также удаляя файлы/папки).

Если я игнорировал асинхронный характер команд, я мог бы позволить первому пользователю внести изменения и поднять исключение на втором, если сказать, что папка, в которой пользователь перемещает видео, больше не существует. Теперь второй пользователь должен обновить часть своего дерева, а затем повторно применить его изменения.

Как мне сделать это с помощью CQRS, если мне требуется мгновенная обратная связь, если мое изменение не разрешено (т. Е. Я пытаюсь переместить видеофайл в другую папку, а другой пользователь удалил папку или переместил ее в другое место)?

+0

Я хотел бы держаться подальше от CQRS, слишком много недостатков и контрсил с ним. –

ответ

1

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

Это уменьшает также много в запас ошибки .The сроки, чтобы иметь что-то, что не удается сводится к тому времени, чтобы отправить команду над сети и время выполнения команды на сервере.

  • Если этот риск действительно низкий. Мы можем получить только команду fail (например: enum) из домена. Для пользователя это может закончиться сообщением об исключительном исключении , и мы могли бы актуализировать его данные, чтобы показать ему , что все по-другому, и он не может делать то, что он намеревался. Такие сообщения с низким процентом не должны быть огромной проблемой, если они встречаются только 2-3 раза в году, я ожидаю.

  • Если риски действительно высок или если проверка невозможна из клиента, но должно происходить только на стороне домена, то у меня нет ответа , чтобы дать вам в данный момент. Я сам изучаю CQRS, а i не могу сказать больше.

надеюсь, что это помогло,

[Редактировать]

Я принял команду обработки, чтобы не быть асинхронной. Если So, я пытаюсь поймать любое исключение во время выполнения команды, и я могу вернуть некоторое уведомление об отказе, не сказав, что именно клиент. Проецирование на другую оставшуюся асинхронную readmodel.

public void Handle(ICommand command) 
     { 
      try 
      { 
       CommandService.Execute(command); 

       Bus.Return(ErrorCodes.None); 
      } 
      catch (Exception e) 
      { 
       Bus.Return(ErrorCodes.Fail); 
      } 
     } 

Мои CommandServiceDelegate право исполнителя, чтобы сделать работу:

Public class TheGoodExecutor{ 
     protected void Execute(IUOW context, MyCommand command) 
     { 
      var myDomainObject= context.GetById<DomainObjecType>(command.Id); 

      myDomainObject.DoStuff(Command.Data); 

      // Accept all the work we just did. 
      context.Accept(); 
     } 
} 

Если хороший исполнитель идет по ошибке, то Bus.Return (ErrorCodes.Fail);

И это может быть получено моим клиентом либо синхронно, либо асинхронно.

Если вы хотите пойти полный асинхр (это то, что я пытаюсь сделать, или, по крайней мере, я хотел бы изучить, что путь), я бы примерить, подписавшись на события, клиент может быть интересно. Для Проверка, я думаю, прислушиваясь к событиям не имеет большого смысла для большинства случаев. Но во втором случае я говорил, может быть. В других случаях, помимо проверки, это тоже может ...

все, что есть в Italic, является личным испытанием, я ничего не читал и ничего не исправлял в этом смысле. Так что возьмите его с большими скобками .. он он!

[/ Edit]

+0

Благодарим вас за ответ. Когда риск низкий, вы сказали, что клиент получит команду fail (перечисление). Можете ли вы объяснить больше, потому что я думал, как только вы вошли в домен, слишком поздно? Другими словами, это модель ответа на запрос, и здесь нет асинхронного вызова. Таким образом, я видел это как, вы проверяете, а затем ударяете по домену с помощью команды. –

+0

см. Мой обновленный ответ. – Arthis

+1

это обсуждение может вас заинтересовать. https://groups.google.com/forum/?fromgroups#!topic/dddcqrs/6HXqTzrwi5E – Arthis

Смежные вопросы