Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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));
                }
            }
        }