• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mehdihadeli / food-delivery-microservices / 28675368858

03 Jul 2026 05:34PM UTC coverage: 16.207% (-46.9%) from 63.071%
28675368858

push

github

web-flow
feat: replace masstransit with wolverine (#253)

337 of 3348 branches covered (10.07%)

Branch coverage included in aggregate %.

125 of 258 new or added lines in 26 files covered. (48.45%)

1396 of 7345 relevant lines covered (19.01%)

0.39 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

87.88
/src/BuildingBlocks/BuildingBlocks.Integration.Wolverine/Extensions/DependencyInjectionExtensions.cs
1
using System.Reflection;
2
using BuildingBlocks.Abstractions.Messages;
3
using BuildingBlocks.Core.Extensions;
4
using BuildingBlocks.Core.Extensions.HostApplicationBuilderExtensions;
5
using BuildingBlocks.Core.Extensions.ServiceCollectionExtensions;
6
using BuildingBlocks.Core.Web.Extensions;
7
using JasperFx.CodeGeneration.Model;
8
using Microsoft.Extensions.Configuration;
9
using Microsoft.Extensions.DependencyInjection.Extensions;
10
using Microsoft.Extensions.Hosting;
11
using RabbitMQ.Client;
12
using Wolverine;
13
using Wolverine.RabbitMQ;
14
using Constants = BuildingBlocks.Core.Constants;
15

16
namespace BuildingBlocks.Integration.Wolverine.Extensions;
17

18
public static class DependencyInjectionExtensions
19
{
20
    public static IHostApplicationBuilder AddWolverineEventBus(
21
        this IHostApplicationBuilder builder,
22
        Action<WolverineOptions>? configureMessagesTopologies = null,
23
        Action<WolverineOptions>? configureBusRegistration = null,
24
        Action<WolverineBusOptions>? configureWolverineBusOptions = null,
25
        Assembly[]? assemblies = null
26
    )
27
    {
28
        assemblies ??= [Assembly.GetCallingAssembly()];
2!
29

30
        // Add option to the dependency injection
31
        builder.Services.AddValidationOptions(configurator: configureWolverineBusOptions);
2✔
32
        var wolverineBusOptions = builder.Configuration.BindOptions<WolverineBusOptions>();
2✔
33

34
        // - EnvironmentVariablesConfigurationProvider is injected by aspire and use to read configuration values from environment variables with `ConnectionStrings:redis` key on configuration.
35
        // The configuration provider handles these conversions automatically, and `__ (double underscore)` becomes `:` for nested sections, so environment configuration reads its data from the ` ConnectionStrings__redis ` environment. all envs are available in `Environment.GetEnvironmentVariables()`.
36
        // - For setting none sensitive configuration, we can use Aspire named configuration `Aspire:StackExchange:Redis:DisableHealthChecks` which is of type ConfigurationProvider and should be set in appsetting.json
37

38
        // https://learn.microsoft.com/en-us/dotnet/aspire/messaging/rabbitmq-integration?tabs=dotnet-cli#use-a-connection-strin
39
        // first read from aspire injected ConnectionString then read from config
40
        var connectionString =
2!
41
            builder.Configuration.GetConnectionString(Constants.AspireResources.Rabbitmq)
2✔
42
            ?? wolverineBusOptions.RabbitMQConnectionString
2✔
43
            ?? throw new InvalidOperationException(
2✔
44
                $"Connection string '{Constants.AspireResources.Rabbitmq}' or `{nameof(WolverineBusOptions)}.{nameof(WolverineBusOptions.RabbitMQConnectionString)}` not found."
2✔
45
            );
2✔
46

47
        builder
2✔
48
            .Services.AddOptions<HostOptions>()
2✔
49
            .Configure(options =>
2✔
50
            {
2✔
51
                options.StartupTimeout = TimeSpan.FromSeconds(60);
2✔
52
                options.ShutdownTimeout = TimeSpan.FromSeconds(60);
2✔
53
            });
2✔
54

NEW
55
        builder.Services.AddSingleton<IHostedService>(sp => new RabbitMqTopologyProvisioningHostedService(
×
NEW
56
            connectionString,
×
NEW
57
            sp.GetRequiredService<Microsoft.Extensions.Logging.ILogger<RabbitMqTopologyProvisioningHostedService>>()
×
NEW
58
        ));
×
59

60
        // will override default null messaging types - we should not use `TryAddTransient` to replace null types
61
        builder.Services.Replace(ServiceDescriptor.Transient<IExternalEventBus, WolverineEventBus>());
2✔
62
        builder.Services.Replace(ServiceDescriptor.Transient<IBusDirectPublisher, WolverineDirectPublisher>());
2✔
63

64
        ConfigureInstrumentation(builder, wolverineBusOptions, connectionString);
2✔
65

66
        builder.Services.AddWolverine(options =>
2✔
67
        {
2✔
68
            foreach (var assembly in assemblies)
2✔
69
            {
2✔
70
                options.Discovery.IncludeAssembly(assembly);
2✔
71
            }
2✔
72

2✔
73
            options.UseRuntimeCompilation();
2✔
74
            options.ServiceLocationPolicy = ServiceLocationPolicy.AllowedButWarn;
2✔
75

2✔
76
            configureBusRegistration?.Invoke(options);
2!
77

2✔
78
            options.UseRabbitMq(connectionString);
2✔
79

2✔
80
            configureMessagesTopologies?.Invoke(options);
2!
81
        });
2✔
82

83
        return builder;
2✔
84
    }
85

86
    private static void ConfigureInstrumentation(
87
        IHostApplicationBuilder builder,
88
        WolverineBusOptions wolverineBusOptions,
89
        string connectionString
90
    )
91
    {
92
        if (!wolverineBusOptions.DisableTracing)
2✔
93
        {
94
            builder
2✔
95
                .Services.AddOpenTelemetry()
2✔
96
                .WithTracing(p =>
2✔
97
                {
2✔
98
                    p.AddSource("RabbitMQ.Client.*");
2✔
99
                });
2✔
100
        }
101
    }
2✔
102
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc