TLDR; Прокрутите до конца ответ, но предыстория даст хороший контекст.
Если вызывающий абонент вашего домена должен знать порядок, в котором он должен вызывать вещи, то вы упустили возможность инкапсулировать бизнес-логику в свой домен, что является признаком анемичного домена .
@ RobertBräutigam высказал очень хорошую мысль:
Требование последовательности технических вызовов является формой временной связи, считается плохой практикой и не имеет прямого отношения к DDD.
Это правда, но это хуже , когда вы делаете это с вашей моделью домена, потому что проблемы, не связанные с доменом, смешиваются с проблемами домена. Намерение теряется в море не деловой логики. Если вы можете, вы ищите агрегат высшего порядка, который инкапсулирует порядок. Чтобы позаимствовать пример Роберта, вместо того, чтобы забронировать рейс, а затем забронировать номер в отеле, и навязать его клиенту, вы можете получить совокупный отпуск , принять и подтвердить его.
Я знаю, что это звучит неправильно в вашем случае, и я подозреваю, что вы правы. Существует явная зависимость, что не может произойти сразу, поэтому мы не можем быть концом истории. Когда у вас есть четкая зависимость от промежуточных транзакций, которые должны произойти до «конечного» состояния, мы имеем ... оркестровку (например, саги, распределенные транзакции, доменные события и все такое добро).
То, что вы описываете с файловыми операциями, распространяется на все транзакции. Манипулирование (изменение состояния) домена является транзакционным в каждой точке распределенной транзакции, но не является транзакционным в целом. Поэтому, когда @ choquero70 говорит
Вы описываете, как оркестровка операций модели домена. Это работа прикладного уровня, модели слоя на домене.
это тоже правильно. Оркестровка является ключевым. Каждый шаг должен манипулировать состоянием домена один раз и только один раз и оставлять его в допустимом состоянии, но при этом все в порядке, чтобы было несколько шагов.
Каждый из этих отдельных пунктов на временной шкале является действительным моментом в состоянии вашего домена .
Итак, вернемся к вашей модели. Если вы предоставляете один интерфейс с несколькими возможными вызовами для всех шагов, то вы оставляете себя открытым для вещей, вызываемых не по порядку. Сделать это невозможным или, по крайней мере, невероятным. Оркестровка - это не только то, что нужно сделать, но и то, что нужно предотвратить. Создайте меньшие интерфейсы / классы, чтобы избежать случайного увеличения «площади поверхности» того, что могло быть случайно использовано неправильно.
Таким образом, вы указываете вызывающей стороне, что делать дальше, передавая им действительные промежуточные состояния. Но, , и это важная часть , бремя того, что вызывать в каком порядке, не для вызывающего абонента. Конечно, звонящий мог знать, что делать, но зачем его заставлять.
Ваш основной алгоритм такой же: загрузка, преобразование, загрузка.
Является ли вызывающая сторона ответственным за вызов методов в правильной последовательности?
Не совсем. Является ли ответственность вызывающего абонента выбирать законный выбор с учетом состояния вашего домена. Вы несете ответственность за представление этих вариантов с помощью бизнес-методов на правильно смоделированном агрегате момент / интервал , подходящем для вызывающего абонента.
Или мы заставляем методы обрабатывать зависимые операции, прежде чем их собственная логика?
Если вы правильно настроили оркестровку, в этом нет необходимости. Но в любом случае имеет смысл проверить.
На заметке, каждый шаг оркестровки, который вы делаете, должен быть очень линейным по природе. Я говорю своим разработчикам с подозрением относиться к шагу оркестровки, в котором есть оператор if . Если есть , если , то, вероятно, лучше быть частью другого шага оркестровки или инкапсулироваться в бизнес-логику.