###################### Generic event handlers ###################### You can create handlers that are invoked for all events. To do that you have to create an open generic class implementing the ``IEventHandler`` interface. See :ref:`Events usage ` for details. For example this event handler will be invoked for all events: .. sourcecode:: csharp /// /// This class catchs all events /// public class GenericEventHandler : IEventHandler where T : IEvent { private readonly ILogger> _logger; public GenericEventHandler(ILogger> logger) { _logger = logger; } public Task Handle(T @event, CancellationToken cancellationToken) { _logger.LogDebug("Received event: ", @event); return Task.CompletedTask; } } Another example. Imagine that you have an abstract class called ``BaseEvent`` for some events in your app, and you want to create a handler that is only invoked for all events that are derived from BaseEvent. This will do the trick: .. sourcecode:: csharp public abstract class BaseEvent : IEvent { public Guid EventId { get; } public BaseEvent() { EventId = Guid.NewGuid(); } } /// /// This class catchs all BaseEvent derived events /// public class BaseEventGenericHandler : IEventHandler where T : BaseEvent { private readonly ILogger> _logger; public BaseEventGenericHandler(ILogger> logger) { _logger = logger; } public Task Handle(T @event, CancellationToken cancellationToken) { _logger.LogDebug("Received base event derived event: ", @event); return Task.CompletedTask; } } .. important:: This depends on the DI container support for generic variance.