Образцово-показательный интерфейс для EventBus
От: Shmj Ниоткуда  
Дата: 23.11.21 06:54
Оценка: -3
Думаю так или иначе почти всем с этим приходится работать, так что достойно обсуждения.

Возьмем, для примера, из образцового проекта:

  Скрытый текст
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. Спорный момент — подтверждение сделано явным в виде отдельного метода. Т.к. теперь не вызываем обработчики событий а просто их возвращаем — то делаем явно.

Что используете вы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.