Example #1
0
        public async Task RouteNotification(IRequestDescriptor <TDescriptor> descriptors, Notification notification, CancellationToken token)
        {
            using (_activityTracingStrategy?.ApplyInbound(notification) ?? Disposable.Empty)
            {
                using var debug = _logger.TimeDebug("Routing Notification {Method}", notification.Method);
                using var _     = _logger.BeginScope(
                          new[] {
                    new KeyValuePair <string, string?>("Method", notification.Method),
                    new KeyValuePair <string, string?>("Params", notification.Params?.ToString())
                }
                          );

                object? @params = null;
                if (!(descriptors.Default?.Params is null))
                {
                    if (descriptors.Default.IsDelegatingHandler)
                    {
                        _logger.LogTrace(
                            "Converting params for Notification {Method} to {Type}", notification.Method, descriptors.Default.Params.GetGenericArguments()[0].FullName
                            );
                        var o = notification.Params?.ToObject(descriptors.Default.Params.GetGenericArguments()[0], _serializer.JsonSerializer);
                        @params = Activator.CreateInstance(descriptors.Default.Params, o);
                    }
                    else
                    {
                        _logger.LogTrace("Converting params for Notification {Method} to {Type}", notification.Method, descriptors.Default.Params.FullName);
                        @params = notification.Params?.ToObject(descriptors.Default.Params, _serializer.JsonSerializer);
                    }
                }

                await Task.WhenAll(descriptors.Select(descriptor => InnerRoute(_serviceScopeFactory, descriptor, @params, token))).ConfigureAwait(false);
            }