public void returns_expected_message_format()
        {
            var e = new DomainEventEnvelope
            {
                AggregateId   = "A1",
                EventId       = Guid.Empty,
                CorrelationId = "987F693E-EF45-4518-8AFB-105B209887B1",
                Type          = "foo-type",
                Data          = "{\"Foo\":\"bar\"}"
            };

            var result = MessagingHelper.CreateMessageFrom(e);

            var expected = @"
{
    ""version"": ""1"",
    ""eventName"": ""foo-type"",
    ""x-correlationId"": ""987F693E-EF45-4518-8AFB-105B209887B1"",
    ""x-sender"": ""CapabilityService.WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
    ""payload"": {""foo"":""bar""}
}";

            Assert.Equal(
                expected: expected.Replace(" ", "").Replace("\n", "").Replace("\r", ""),
                actual: result.Replace(" ", "").Replace("\n", "").Replace("\r", "")
                );
        }
        private async Task DoWork(CancellationToken stoppingToken)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var dbContext             = scope.ServiceProvider.GetRequiredService <CapabilityServiceDbContext>();
                var domainEventsToPublish = await dbContext
                                            .DomainEvents
                                            .Where(x => x.Sent == null)
                                            .ToListAsync(stoppingToken);

                if (domainEventsToPublish.Any() == false)
                {
                    return;
                }

                Log.Information($"Domain events to publish: {domainEventsToPublish.Count}");

                var publisherFactory = scope.ServiceProvider.GetRequiredService <KafkaPublisherFactory>();
                var eventRegistry    = scope.ServiceProvider.GetRequiredService <IDomainEventRegistry>();

                Log.Information("Connecting to kafka...");

                using (var producer = publisherFactory.Create())
                {
                    Log.Information("Connected!");

                    foreach (var evt in domainEventsToPublish)
                    {
                        var topicName = eventRegistry.GetTopicFor(evt.Type);
                        var message   = MessagingHelper.CreateMessageFrom(evt);

                        try
                        {
                            var result = await producer.ProduceAsync(
                                topic : topicName,
                                message : new Message <string, string>
                            {
                                Key   = evt.AggregateId,
                                Value = message
                            }
                                );

                            evt.Sent = result.Timestamp.UtcDateTime;
                            await dbContext.SaveChangesAsync();

                            Log.Information($"Domain event \"{evt.Type}>{evt.EventId}\" has been published!");
                        }
                        catch (Exception)
                        {
                            throw new Exception($"Could not publish domain event \"{evt.Type}>{evt.EventId}\"!!!");
                        }
                    }
                }
            }
        }
        public void returns_expected_message_format()
        {
            var e = new DomainEventEnvelope
            {
                AggregateId = "A1",
                EventId     = Guid.Empty,
                Type        = "foo-type",
                Data        = "{\"Foo\":\"bar\"}"
            };

            var result = MessagingHelper.CreateMessageFrom(e);

            var expected = @"
{
    ""messageId"": ""00000000-0000-0000-0000-000000000000"",
    ""type"": ""foo-type"",
    ""data"": {""foo"":""bar""}
}";

            Assert.Equal(
                expected: expected.Replace(" ", "").Replace("\n", "").Replace("\r", ""),
                actual: result.Replace(" ", "").Replace("\n", "").Replace("\r", "")
                );
        }