namespace Femto.Common.Integration; public interface IEventHandler { Task Handle(IEvent evt, CancellationToken cancellationToken = default); } public abstract class EventHandler : IEventHandler where T : IEvent { protected abstract Task Handle(T evt, CancellationToken cancellationToken); public async Task Handle(IEvent evt, CancellationToken cancellationToken = default) { if (evt is not T typedEvt) { throw new InvalidOperationException( $"Event {evt.GetType()} is not of type {typeof(T)}" ); } await Handle(typedEvt, cancellationToken); } }