/// <inheritdoc /> public IDisposable RegisterListener <TListener>(TListener listener, Func <Func <Task>, Task>?invoker = null) where TListener : IEventListener { if (listener == null) { throw new ArgumentNullException(nameof(listener)); } IReadOnlyList <RegisteredEventListener>?eventListeners = RegisteredEventListener.FromType(listener.GetType()); var disposes = new List <IDisposable>(eventListeners.Count); foreach (var eventListener in eventListeners) { IRegisteredEventListener wrappedEventListener = new WrappedRegisteredEventListener(eventListener, listener); if (invoker != null) { wrappedEventListener = new InvokedRegisteredEventListener(wrappedEventListener, invoker); } var register = _temporaryEventListeners.GetOrAdd( wrappedEventListener.EventType, _ => new TemporaryEventRegister()); disposes.Add(register.Add(wrappedEventListener)); } if (eventListeners.Count > 0) { _cachedEventHandlers.TryRemove(typeof(TListener), out _); } return(new MultiDisposable(disposes)); }
/// <summary> /// Get all the event listeners for the given event type. /// </summary> /// <returns>The event listeners.</returns> private IEnumerable <EventHandler> GetHandlers <TEvent>() where TEvent : IEvent { Type?eventType = typeof(TEvent); var interfaces = eventType.GetInterfaces(); foreach (var @interface in interfaces) { if (_temporaryEventListeners.TryGetValue(@interface, out var cb)) { foreach (var eventListener in cb.GetEventListeners()) { yield return(new EventHandler(null, eventListener)); } } } foreach (var handler in _serviceProvider.GetServices <IEventListener>()) { if (handler is IManualEventListener manualEventListener && manualEventListener.CanExecute <TEvent>()) { yield return(new EventHandler(handler, new ManualRegisteredEventListener(manualEventListener))); continue; } var events = RegisteredEventListener.FromType(handler.GetType()); foreach (var eventHandler in events) { if (eventHandler.EventType != typeof(TEvent) && !interfaces.Contains(eventHandler.EventType)) { continue; } yield return(new EventHandler(handler, eventHandler)); } } if (_temporaryEventListeners.TryGetValue(eventType, out var cb2)) { foreach (var eventListener in cb2.GetEventListeners()) { yield return(new EventHandler(null, eventListener)); } } }