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)); }