Что-то вроде простенького, как промо-код, на самом деле может быть довольно сложным вариантом использования. Прежде всего, это связано с тем, что промокод является логикой, которая (как правило) поддерживается одним или несколькими бизнес-пользователями, тогда как она также принадлежит внутри домена. Это нетрадиционно, в этом смысле. Есть несколько способов справиться с этим, и то, что я опишу, будет просто моим личным подходом.
Ради аргумента, предположим, что у вас есть простой ряд известных рекламных кодов, таких как:
- X% Off Покупка, с или без минимальной покупки
- $ X Off Покупка, с или без минимальной покупки
Мы можем сделать некоторые предположения, а также:
- А.П. romotional код имеет начальную дату
- промокод имеет дату окончания
Применение промо-кода может быть сложно. Рассмотрим два сценария, которые мы определили. «$ X Off Purchase» сравнительно прост, так как фиксированная сумма. Однако покупка «X% Off Purchase» сложнее. Если бы у нас была только фиксированная сумма, мы могли бы применить скидку к тележке, как только будут достигнуты любые пороговые значения. Если скидка на процентную ставку, если пользователь должен добавить два элемента, добавьте промо-код, а затем добавьте еще один элемент, продвижение будет уже «применено».
Из-за этого я лично лично «приложил» рекламный код к тележке. Зачем? Причина в том, что в момент проверки я могу предположить, что тележка будет использоваться для создания заказа. До этого времени содержимое тележки было жидким.Действие пользователя против корзины изменит общее значение корзины, а также общую скидку при допущении нефиксированной скидки. Он также может сделать скидку недействительной, если пользователь удалит один или несколько предметов из корзины, а общая стоимость корзины опустится ниже порога, чтобы применить скидку.
Итак, у меня было бы несколько команд, которые были бы задействованы. По сути, любые команды, которые влияют на стоимость корзины, могут изменить сумму скидки. С этой целью, я искал бы сумму скидки будет пересчитана для команд, которые:
- Добавить товар в корзину
- Удаление элемента из корзины
- изменить количество элементов в телега
- Добавить промокод в корзину
- Измените скидочное прикрепленную к телеге
Поскольку все они являются Operat против телеги, я бы подсчитал скидку в рамках промокода, сам с участием данных, содержащихся в тележке. Это чувствует, что, как промокод, будет агрегатом, идя по этому пути. Таким образом, я бы обработчикам команд вызывать службу домена, которая может предоставить моей телеге необходимую информацию. Эта служба домена будет загружать промокод, и я собираюсь пройти в позициях этой корзины, чтобы промокод подскажет мне, какой будет рассчитанная скидка. Затем я собираюсь создать событие, которое содержит новое значение корзины, а также скорректированное значение (скидка). Идя по этому пути, логика расчета скидки, основанная на позициях в корзине, несет ответственность за промо-код.
Вы можете поместить эту ответственность в корзину, вместо этого. Лично, однако, мне кажется, что инкапсуляция логики домена в промокод, сама по себе, имеет больше смысла. Я упомянул, что вполне вероятно, что вы создадите заказ из корзины. Имея промокод в качестве совокупности и содержащий логику применения скидки на основе позиций, мы имеем единственную истину в том, как мы вычисляем скидку на позиции - будь то с точки зрения тележки или в условия заказа.
Если это полезно у меня есть сообщение в блоге, который выкладывает типичные CQRS и применение ES и как она вписывается вместе. Вы можете увидеть его здесь [CQRS + Event Sourcing - шаг за шагом обзора] (http://danielwhittaker.me/2014/10/02/cqrs-step-step-guide-flow-typical-application/) – Codescribler