Esempio n. 1
0
        public Task HandleAsync(INotificationIndication notification, ServiceFactory serviceFactory,
                                CancellationToken cancellationToken = default)
        {
            var handlers  = serviceFactory.GetRequiredService <IEnumerable <INotificationHandler <TNotification> > >();
            var factories = handlers.Select(handler => new Func <Task>(() => handler.HandleAsync((TNotification)notification, cancellationToken)));

            return(PublishAsync());

            async Task PublishAsync()
            {
                foreach (var factory in factories)
                {
                    await factory.Invoke().ConfigureAwait();
                }
            }
        }
        public Task Publish(INotificationIndication notification, CancellationToken cancellationToken = default)
        {
            var notificationType   = notification.GetType();
            var handlerWrapperType = typeof(INotificationHandlerWrapper <>).MakeGenericType(notificationType);

            var handlerWrapper = _notificationHandlers.GetOrAdd(notificationType,
                                                                type => (INotificationHandlerWrapperIndication)_serviceFactory.GetRequiredService(handlerWrapperType));

            //var method = handlerWrapperType.GetMethod("HandleAsync");
            //return (Task)method.Invoke(handlerWrapper, new object[]
            //{
            //    notification, _serviceProvider, cancellationToken
            //});

            return(((dynamic)handlerWrapper).HandleAsync(notification, _serviceFactory, cancellationToken));
        }