ADM - хороший шаблон для решения распределенных сервисов, таких как микросервисы. Он подходит для многих современных бизнес-кейсов.
Рассмотрим, есть ли у нас объект Order Domain. При подходе ООП мы бы добавили Order.Purchase () Order.Cancel () и т. Д. Это будет хорошо работать в настольном приложении, где мы храним заказы в памяти и выполняем несколько операций с одним экземпляром.
Но если у нас есть распределенная система с программами, которые предназначены только для одной цели, то есть для доступа к списку заказов и покупки каждого по очереди, или для получения списка заказов и отмены каждого по очереди, то использование обоих методов для одного и того же объекта не дает смысл. У нас должно быть два домена или ограниченный контекст:
PurchaseSystemOrder.Purchase()
а также
CancelSystemOrder.Cancel();
Единственное, что эти объекты разделяют, это структура данных свойств.
По мере того, как вы добавляете все больше и больше микросервисов, вы получаете десятки типов ордеров. Он больше не имеет смысла говорить о качестве ордена в качестве объекта домена, несмотря на то, его же концептуальном порядке , который обрабатывается всеми этими системами.
Гораздо разумнее иметь модель Anemic Order, которая просто инкапсулирует только данные и соответственно переименовывает ваши сервисы:
PurchaseService.Purchase(Order order)
Теперь мы можем снова поговорить о заказе и добавить любые новые сервисы, которые мы придумаем для обработки, не затрагивая другие развернутые в настоящее время сервисы.
Фаулер и Ко происходят из монолитной системы, в их мире подход ADM означал бы одно приложение, в котором все эти отдельные службы были бы созданы в памяти, а OrderDTO передавался и мутировал. Это было бы намного хуже, чем помещать методы в модель богатого порядка.
Но в распределенной системе существует много программ, каждая из которых требует только одного метода Order и запускает его по нескольким заказам, загружая каждую, запуская метод, а затем отбрасывая его. Для этого требуется только один Сервис и поток объектов данных.
Полное заполнение богатой модели, беспокоясь о требованиях и зависимостях всех методов только для вызова одного и последующего немедленного отказа от объекта, бессмысленно.
Кроме того, изменение одного из методов потребовало бы обновления всех распределенных компонентов, поскольку все они зависят от модели Rich для своей логики.
У меня нет места в моей базе кода для вещей, которые им не нужны