Соединение точек с помощью DDD

Я читал Эванса, Нильссона и Маккарти, среди прочих, и понимаю концепции и рассуждения, лежащие в основе дизайна, ориентированного на предметную область; однако мне трудно собрать все это вместе в реальном -мировом приложении. Отсутствие полных примеров заставило меня почесать голову. Я нашел много фреймворков и простых примеров, но пока ничего, что действительно демонстрирует, как создать реальное бизнес-приложение в соответствии с DDD.

Используя в качестве примера типичную систему управления заказами, возьмем случай отмены заказа. В моем дизайне я вижу OrderCancellationService с методом CancelOrder, который принимает заказ #и причину в качестве параметров. Затем он должен выполнить следующие «шаги»:

  1. Убедитесь, что у текущего пользователя есть необходимые права для отмены заказа
  2. . Получить объект Order с указанным заказом #из OrderRepository
  3. . Убедитесь, что Заказ может быть отменен (, если служба запросит состояние Заказа для оценки правил, или у Заказа есть свойство CanCancel, которое инкапсулирует правила?)
  4. Обновите состояние объекта Order, вызвав Order.Cancel (Reason)
  5. Сохранить обновленный заказ в хранилище данных
  6. Обратитесь в службу CreditCardService, чтобы отменить все платежи по кредитной карте, которые уже были обработаны
  7. . Добавить запись аудита для операции

Конечно, все это должно происходить в транзакции, и ни одна из операций не должна выполняться независимо. Я имею в виду, что я должен отменить транзакцию по кредитной карте, если отменю заказ, я не могу отменить и не выполнить этот шаг. Это, имхо,предлагает лучшую инкапсуляцию, но я не хочу иметь зависимость от CreditCardService в моем объекте домена (Order ), поэтому похоже, что это ответственность службы домена.

Я ищу кого-то, кто покажет мне примеры кода, как это может/должно быть "собрано". Мыслительный -процесс, лежащий в основе кода, поможет мне соединить все точки для себя. Спасибо!

5
задан jpm70 13 May 2012 в 20:02
поделиться