Посмотрев это видео по Greg Yound на DDDКак реализовать CQS с изменениями в памяти?
http://www.infoq.com/interviews/greg-young-ddd
мне было интересно, как вы могли бы реализовать Command-Query Separation (ОКК) с DDD, когда у вас есть в изменениях памяти?
С CQS у вас есть два репозитория, один для команд, один для запросов. Как и две группы объектов, объекты команд и объекты запроса. Объекты Command имеют только методы и не обладают свойствами, которые могут отображать форму объектов и не должны использоваться для отображения данных на экране. Объекты запроса, с другой стороны, используются для отображения данных на экране.
В видео команды всегда идут в базу данных, поэтому вы можете использовать репозиторий запросов для извлечения обновленных данных и повторного отображения на экране.
Не могли бы вы использовать CQS с чем-то похожим и редактировать экран в ASP.NET, где сделаны изменения в памяти, и экран нужно обновлять несколько раз с изменениями до того, как изменения сохраняются в базе данных?
Например
- Принести объект запроса из хранилища запроса и отображать его на экране
- я нажимаю редактировать
- Я refetch объект запроса из хранилища объектов запроса и отображать его на форма в режиме редактирования
- Я меняю значение на форму, которая автоматически возвращает назад и извлекает командный объект и выдает соответствующую команду
- ЧТО ДЕЛАТЬ: Мне теперь нужно отобразить upda когда команда произвела изменения в вычисленных полях. Поскольку объект команды не был сохранен в базе данных, я не могу использовать репозиторий запросов. И с CQS я не собираюсь выставлять форму объекта команды для отображения на экране. Как бы вы вернули объект запроса с обновленными изменениями для отображения на экране.
Несколько возможных решений, о которых я могу думать, это иметь репозиторий сеанса или способ получения объекта запроса из объекта команды. Или CQS не применяется к этому типу сценария?
Мне кажется, что в видео изменения сразу сохраняются в базе данных, и я не нашел пример DDD с CQS, который решает проблему пакетных изменений объекта домена и обновляет представление модифицированного объекта домена, прежде чем, наконец, выдать команду для сохранения объекта домена.
Спасибо за ответ. Мне интересно, как обычный/хороший дизайн использовать CQS, когда изменения хранятся в памяти, а не сохраняются прямо в базе данных? Это в основном то, что мы придумали, это использовать репозитории сеансов, чтобы репозиторий запросов мог получить доступ к данным команды через переменную сеанса. Возможно, позже захотите репозитории HttpContext. Кто-нибудь видел это раньше? Мысли оценили. – Ian
На мой взгляд, метод, используемый для управления источником данных, не должен опираться на тип источника данных. Шаблон репозитория позволяет отвлечь эти различия, позволяя вам обрабатывать любой источник данных, как если бы он представлял собой запрограммированную коллекцию объектов.Реализация целевого источника данных зависит от конкретных реализаций репозитория, поэтому теоретически вы должны иметь «InMemoryRepository» и «DatabaseRepository» - или что у вас есть. –
Да, я понимаю, что вы можете поменять хранилище InMemory для репозитория базы данных. Часть значения CQS заключается в том, что вы выдаете команды в базу данных и отдельно извлекаете обновленные данные в репозиторий запросов. В памяти объект команды находится в сеансе, поэтому репозиторий запросов может только отбрасывать данные в объекте команды. С версией базы данных объект запроса может полностью отличаться от объекта команды, просто кажется, что память CQS намного ближе. Интересно, как это вписывается в то, что CQS пыталось достичь. – Ian