Я новичок в Autofac и не могу привести пример работы приложения подписчика на событие. Не могли бы вы помочь мне смоделировать это?
Идея заключается в следующем.
У меня есть контроллер REST API, где клиенты могут отправлять события POST (реализации IDomainEvent)
Контроллер должен получать ВСЕ введенные классы проектора (обработчики событий), которые будут что-то делать с событиями.
public class EventsController
: Controller
{
private readonly IEnumerable<IEventHandler> _projectors;
public EventsController(IEnumerable<IEventHandler> projectors)
{
_projectors = projectors;
}
[HttpPost("EventA")]
public IActionResult AddEventA([FromBody]EventA evt)
{
foreach (var projector in _projectors)
{
projector.Handle(evt);
}
return Ok();
}
[HttpPost("EventB")]
public IActionResult AddEventB([FromBody]EventB evt)
{
foreach (var projector in _projectors)
{
projector.Handle(evt);
}
return Ok();
}
}
А потом у меня есть много Проекторов (обработчиков событий), которые делают разные вещи с событиями, на которые они подписываются.
public class ProjectorA : IEventHandler<EventA>, IEventHandler<EventB>
{
private readonly IRepository _repository;
public ProjectorA(IRepository repository)
{
_repository = repository;
}
public void Handle(EventA evt)
{
// do something with EventA
}
public void Handle(EventB evt)
{
// do something with EventB
}
}
public class ProjectorB : IEventHandler<EventA>
{
private readonly IRepository _repository;
public ProjectorA(IRepository repository)
{
_repository = repository;
}
public void Handle(EventA evt)
{
// do something with EventA
}
// I don't care about EventB so I don't subscribe to it
}
IEventHandler будет выглядеть примерно так:
public interface IEventHandler<in TDomainEvent>
: IEventHandler
where TDomainEvent : IDomainEvent
{
void Handle(TDomainEvent evt);
}
Как изменить это моделирование и как зарегистрировать мои проекторы в Autofac, чтобы использовать его аналогичным образом?
Заранее спасибо!