public Task SendAsync(T message, string topicName)
            {
                var sender = _messagingFactory.CreateMessageSender(topicName);

                var body =
                    JsonConvert.SerializeObject(
                        new { Data = message },
                        Formatting.None,
                        new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                }
                        );

                var bytes  = Encoding.UTF8.GetBytes(body);
                var stream = new MemoryStream(bytes, writable: false);

                var brokeredMessage = new BrokeredMessage(stream)
                {
                    ContentType = "application/json"
                };

                if (message is IHasCorrelationId correlationMessage)
                {
                    brokeredMessage.CorrelationId = correlationMessage.CorrelationId ?? brokeredMessage.CorrelationId;
                }

                _azureTopicMqSettings.AzureMessagePropertyBuilder(message)
                .ToList()
                .ForEach(x => brokeredMessage.Properties.Add(x.Key, x.Value));

                if (!_excludeTopicsFromLogging.Contains(topicName))
                {
                    _logMessage($"{nameof(SendAsync)}/{topicName} sending message '{body}' with Azure MessageId: '{brokeredMessage.MessageId}'");
                }

                return(sender.SendAsync(brokeredMessage)
                       .ContinueWith(task =>
                {
                    if (task.Exception != null)
                    {
                        _logError($"{nameof(SendAsync)}/{topicName} error occurred: {task.Exception}");
                    }

                    return task;
                }));
            }