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