Я размышлял над этим какое-то время. В общем, я стараюсь держаться подальше от внедрения сервисов в свой домен, но у меня есть такой случай:
У меня есть объект PurchaseOrder. Этот заказ отправляется поставщику с помощью какой-либо службы (электронной почты или веб-сервиса). После отправки заказа пользователю, оформившему заказ, должно быть отправлено подтверждение.
Итак, я понял, что это тот случай, когда события домена были бы хорошим способом реализации публикации события PurchaseOrderMade.
Потом я задумался:
Действительно ли заказ сделан, если заказ не был отправлен?
Вы не сделали заказ только потому, что решили его сделать и записали, а заказ сделан в тот момент, когда вы передали его поставщику по договору без ошибок.
Поэтому я передумал и подумал, что в конце концов это может принадлежать домену, поэтому я должен отправить его, внедрив IPurchaseOrderSender в свой домен, а затем опубликовать OrderMadeEvent после успешной транзакции и отправки подтверждения в EventHandler.
Причина такова:
- Отправка заказа ЯВЛЯЕТСЯ важной частью процесса и может привести к изменению состояния (т.е. установить флаг, что заказ отправлен)
- Подтверждение НЕ имеет решающего значения, если это не удастся, заказ все равно будет сделан, и все пойдет по плану.
- Легко читать и изменять реализацию IOrderService.
Вопросы:
- Неужели это так плохо делать?
- Нарушает ли это принципы DDD?
- Вы сталкивались с этим раньше и решили это лучше?
Вот код:
public void MakeOrder(PurchaseOrder order, IPurchaseOrderSender orderSender)
{
if(PurchaseOrders == null)
PurchaseOrders = new List<PurchaseOrder>();
PurchaseOrders.Add(order);
orderSender.Send(order);
DomainEvents.Raise(new PurchaseOrderIsMade(){Order = order});
}
public interface IPurchaseOrderSender
{
void Send(PurchaseOrder order);
}