Основной класс - Mediator. Представляет собой посредник, позволяющий связывать различные виды сообщений и их обработчики.
EventCollector позволяет обеспечить отложенную отправку через посредник.
- Добавляем в класс зависимость от IMediator.
- Создаем либо регистрируем в DI класс Mediator, параметризуя его коллекциями синхронных и асинхронных обработчиков сообщений. Список обработчиков должен соответствовать ожидаемым в сервисе типам сообщений.
- В методах сервисов вызываем методы интерфейса SendMessage либо SendMessageAsync. Посредник автоматически направит сообщение соответствующему обработчику.
public IHttpActionResult Get() { IEnumerable products = _mediator.SendMessage<GetProductsRequest, IEnumerable>(new GetProductsRequest());
if (products is null || !products.Any())
{
return NotFound();
}
else
{
return Ok(products);
}
}
- Реализовать в сущности интерфейс IEntityEventPublisher. Стандартная реализация сохраняет экземпляр IEventCollector во внутреннюю переменную.
public class Payroll : IEntityKey, IEntityEventPublisher { private IEventCollector _eventCollector;
public virtual void SetCollector(IEventCollector eventCollector);
{
_eventCollector = eventCollector;
}
}
- При необходимости опубликовать событие с использованием IEventCollector.
_eventCollector.Enqueue(new PayrollReachesFinalStatusEvent(this));
-
В аппликационном сервисе, управляющем доменными сущностями, реализовать единицу работы для отправки доменных событий.
using (var collector = _eventCollectorFactory.Create()) { ... collector.Publish(); }
Для корректной обработки событий Handlers должны быть зарегистрированы в классе Mediator.