Думаю так или иначе почти всем с этим приходится работать, так что достойно обсуждения.
Возьмем, для примера,
из образцового проекта:
| Скрытый текст |
| public interface IEventBus
{
void Publish(IntegrationEvent @event);
void Subscribe<T, TH>()
where T : IntegrationEvent
where TH : IIntegrationEventHandler<T>;
void SubscribeDynamic<TH>(string eventName)
where TH : IDynamicIntegrationEventHandler;
void UnsubscribeDynamic<TH>(string eventName)
where TH : IDynamicIntegrationEventHandler;
void Unsubscribe<T, TH>()
where TH : IIntegrationEventHandler<T>
where T : IntegrationEvent;
}
|
| |
Как бы представлено в общем виде — публикация, подписка, отписка. Все ли вам тут нравится?
Предлагаю типа такой вариант:
| Скрытый текст |
| public interface IEventBus
{
Task PublishAsync(IntegrationEvent @event);
Task SubscribeAsync<TEvent>()
where TEvent : IntegrationEvent;
Task UnsubscribeAsync<TEvent>()
where TEvent : IntegrationEvent;
IAsyncEnumerable<IntegrationEvent> SelectEventsAsync();
Task ConfirmAsync(string deliveryTag);
}
|
| |
1. Добавлена асинхронность.
2. Не обязательно для каждого типа событий создавать свой обработчик. Получаем все типы событий, на которые подписались — если хотите только определенные события — то создайте новый инстанс IEventBus и сделайте подписку только на определенные — вполне логично, кмк.
3. Спорный момент — подтверждение сделано явным в виде отдельного метода. Т.к. теперь не вызываем обработчики событий а просто их возвращаем — то делаем явно.
Что используете вы?