Должен ли я всегда отправлять весь документ команде, которая обновляет MongoDB?

Эта часть вашего оператора компиляции:

gfortran Codigo.f 

будет обрабатывать исходный файл с суффиксом .f в качестве источника фиксированной формы. Это означает, что строка продолжения указывается любым символом (отличным от пустого или 0) в столбце 6.

Однако сообщение об ошибке, которое вы получаете, предполагает, что + во второй строке вашего фрагмента не находится в столбце 6 и что компилятор рассматривает его как начальный символ в новом имени объекта, для которого он недопустим. Тот факт, что + выровнен по вертикали с помощью n в предыдущей строке, усиливает мое подозрение, что это может быть причиной вашей проблемы.

Добавление амперсанда, как предлагается в теперь удаленном ответ, на самом деле не помогает в этом случае, если вы продолжаете сообщать компилятору, что он имеет дело с исходным файлом с фиксированной формой. & используется только для продолжения в исходных файлах свободной формы. Добавление оператора строки-конкатенации // не помогает, так как за ним не следует другая строка, но заканчивается строка. //& помог, но, вероятно, не нужен.

Я думаю, у вас есть 2 возможных решения, но выберите только один:

  1. Придерживайтесь фиксированной формы и правильно выравнивайте.
  2. Измените суффикс файла на .f90, который заставит gfortran обрабатывать исходный файл как свободную форму.

Если вы переходите на вариант 2 (который Я бы рекомендовал), вы можете либо использовать & в конце строки, либо просто объединить строки. В свободной форме максимальная длина строки составляет 132 символа.

0
задан Ben Thomson 13 July 2018 в 07:06
поделиться

1 ответ

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

  1. Для каждой команды вы обновляете только измененный вложенный документ, т. Е. Заголовок документа.

У этого есть преимущество, которое быстро и вероятность одновременных изменений модификации ниже, если у вас есть отдельная защита для каждого раздела документа на месте (то есть атрибут version для каждого в качестве противопоставления к одному version для всего документа).

Недостаток заключается в том, что он слишком много сочетает модель (класс) Домена с инфраструктурой, поскольку вам нужно поставить запросы внутри класса Document. Если вы смешаете Домен с Инфраструктурой, то у вас больше нет чистой модели, и вы потеряете возможность безопасно повторить команду. Это может быть сделано за пределами класса Domain, в инфраструктуре, если вы «научите» репозиторий инфраструктуры реагировать по-разному на основе испущенных событий.

Это также указание на то, что у вас на самом деле несколько моделей записи , каждая модель для разделов документа (заголовок, тело, нижний колонтитул, заметки и т. д.), поскольку модель записи продиктована границей согласованности. В этом случае они будут использовать один и тот же идентификатор документа.

  1. Для всех команд вы заменяете весь документ, независимо от того, что изменилось внутри.

Он имеет огромное преимущество в том, что вы можете иметь чистый класс домена, без какой-либо зависимости от инфраструктуры. Инфраструктура просто берет все состояние и заменяет сохраняющееся состояние и добавляет новые события в одну и ту же транзакцию.

У этого недостатка это медленнее, чем первое решение. Это курс, если вы будете следовать подходу DDD после определения документа как совокупности (в DDD агрегат полностью загружен и полностью сохраняется в ответ на выполнение команд).

1
ответ дан Constantin Galbenu 17 August 2018 в 13:29
поделиться
  • 1
    Я думаю, что вариант 2 - это правильный путь для меня, но я должен запускать разные события в зависимости от того, какое обновление было сделано для документа (например, добавлена ​​группа или изменено название). Я могу иметь разные конечные точки API для этого, которые вызывают одну и ту же базовую команду обновления. Затем я могу зарегистрировать их, а также отправлять сообщения / обновления любым другим пользователям, которые одновременно обновляют документ. У меня есть 2 других агрегата, поэтому хранение как DDD возможно должно сделать его намного более простым. – Ben Thomson 17 July 2018 в 23:31
  • 2
    @BenThomson да, в CQRS каждая команда генерирует (наиболее вероятные) различные события домена, которые вы можете использовать, что хотите, но после они сохраняются. – Constantin Galbenu 17 July 2018 в 23:37
  • 3
    После дополнительных исследований я думаю, что обновление основных полей документа (название, автор и т. Д.) Должно выполняться с использованием одного вызова для обновления (согласно варианту 2), но каждый из «узлов» на самом деле являются суб-документами (теперь я думаю об этом), которые связаны с другой коллекцией (поскольку они представляют собой другой объект домена) с использованием идентификатора, а также некоторых денормализованных данных. Поэтому, добавляя / удаляя их, я думаю, следует использовать $ push и $ pull. Затем, когда эти поддокументы обновляются в их конкретном представлении, я должен использовать для них одну команду обновления и опубликовать изменения в любых других соответствующих представлениях агрегатов. – Ben Thomson 18 July 2018 в 00:01
  • 4
    @BenThomson Агрегаты - это границы последовательности и защищают инварианты. Каковы ваши инварианты? Мне кажется, что ты не уверен, не так ли? – Constantin Galbenu 18 July 2018 в 04:51
  • 5
    @BenThomson Это тоже моя стратегия, для каждого представления я делаю только запрос на постоянство, никаких объединений или вложенных запросов. – Constantin Galbenu 18 July 2018 в 07:58
Другие вопросы по тегам:

Похожие вопросы: