public async Task SaveAsync(IEnumerable <IEvent> events)
        {
            foreach (var @event in events)
            {
                var eventData = JsonConvert.SerializeObject(@event, JsonSerializerSettings);
                var eventType = @event.GetType().Name;

                var dto = new EventDto
                {
                    AggregateId     = @event.Id,
                    AggregateType   = @event.AggregateType,
                    ApplicationName = _settings.ApplicationName,
                    Version         = @event.Version,
                    TimeStamp       = @event.TimeStamp,
                    EventType       = eventType,
                    EventData       = eventData
                };

                using (var conn = _sqlConnectionFactory.GetWriteConnection())
                {
                    conn.Open();
                    using (var trans = conn.BeginTransaction())
                    {
                        try
                        {
                            await _dapper.ExecuteAsync(conn, _settings.SaveSql, dto, _settings.CommandType, trans).ConfigureAwait(false);

                            await _messageQueue.PublishAsync(eventData, @event.Id, eventType).ConfigureAwait(false);

                            trans.Commit();
                        }
                        catch (Exception)
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
        }