public async Task AuditPreDispatch(ICommand command, ICommandDispatchContext dispatchContext, CancellationToken cancellationToken) { if (_registeredPreDispatchAuditors.Count == 0) { return; } ICommandAuditSerializer serializer = _auditorSerializerFunc(); AuditItem auditItem = new AuditItem { AdditionalProperties = dispatchContext.AdditionalProperties.ToDictionary(x => x.Key, x => x.Value.ToString()), CommandId = null, CommandTypeFullName = command.GetType().AssemblyQualifiedName, CommandType = command.GetType().Name, CorrelationId = dispatchContext.CorrelationId, Depth = dispatchContext.Depth, DispatchedUtc = DateTime.UtcNow, SerializedCommand = serializer.Serialize(command), Type = AuditItem.PreDispatchType }; // ReSharper disable once SuspiciousTypeConversion.Global - used by consumers of the package if (command is IIdentifiableCommand identifiableCommand) { auditItem.CommandId = identifiableCommand.CommandId; } _auditItemEnricherPipeline.Enrich(auditItem.AdditionalProperties, command, dispatchContext); await AuditPreDispatch(auditItem, cancellationToken); }