public async Task PublishAsync(IEvent @event) { var eventName = _store.GetEventKey(@event.GetType()); if (_store.ContainSubscription(eventName)) { var subscriptions = _store.GetHandlers(eventName); foreach (var subscription in subscriptions) { if (subscription.IsDynamic) { var handler = _serviceProvider.GetService(subscription.HandlerType) as IDynamicEventHandler; if (handler == null) { continue; } await handler.Handle(@event); } else { var handler = _serviceProvider.GetService(subscription.HandlerType); if (handler == null) { continue; } var concreteType = typeof(IEventHandler <>).MakeGenericType(@event.GetType()); // ReSharper disable once PossibleNullReferenceException await(Task) concreteType.GetMethod("Handle").Invoke(handler, new object[] { @event }); } } } }
public void Subscribe <T, TH>() where T : class, IEvent where TH : IEventHandler <T> { var eventName = _store.GetEventKey <T>(); Subscribe(eventName); _logger.LogInformation("Subscribing to event {EventName} with {EventHandler}", eventName, typeof(TH).GetEventName()); _store.AddSubscription <T, TH>(); StartBasicConsume(); }