< Summary - AsyncResponse (Release / net8.0+net10.0 / unit+integration)

Information
Class: Microsoft.Extensions.DependencyInjection.RabbitMqAsyncResponseServiceCollectionExtensions
Assembly: AsyncResponse.Transports.RabbitMQ
File(s): /_/src/Transports/AsyncResponse.Transports.RabbitMQ/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 24
Uncovered lines: 0
Coverable lines: 24
Total lines: 56
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithRabbitMqTransport(...)100%11100%

File(s)

/_/src/Transports/AsyncResponse.Transports.RabbitMQ/ServiceCollectionExtensions.cs

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.RabbitMQ;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4
 5namespace Microsoft.Extensions.DependencyInjection;
 6
 7/// <summary>
 8/// DI registration for the RabbitMQ AsyncResponse transport.
 9/// </summary>
 10public static class RabbitMqAsyncResponseServiceCollectionExtensions
 11{
 12    /// <summary>
 13    /// Registers RabbitMQ as the worker transport and response ingress in one call:
 14    /// <list type="bullet">
 15    /// <item><description>worker jobs are published to <see cref="RabbitMqAsyncResponseOptions.WorkerExchange"/> with <
 16    /// <item><description>a hosted consumer reads <see cref="RabbitMqAsyncResponseOptions.WorkerQueue"/> and executes w
 17    /// <item><description>a hosted consumer reads <see cref="RabbitMqAsyncResponseOptions.ResponseQueue"/> and feeds re
 18    /// </list>
 19    /// RabbitMQ is a transport, not a recovery store: pair it with a channel
 20    /// (<c>.WithInMemoryChannel()</c> for simple apps, or <c>.WithRedisChannel()</c> when late
 21    /// responses must survive redeploys), which provides the waiter side and recovery state.
 22    /// </summary>
 23    public static AsyncResponseRegistrationBuilder WithRabbitMqTransport(
 24        this AsyncResponseRegistrationBuilder builder,
 25        Action<RabbitMqAsyncResponseOptions> configure)
 26    {
 19827        ArgumentNullException.ThrowIfNull(configure);
 28
 19829        var services = builder.Services;
 19830        services.AddOptions();
 19831        services.Configure(configure);
 32
 19833        services.TryAddSingleton<RabbitMqWorkerTransport>();
 19834        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider =>
 39435            provider.GetRequiredService<RabbitMqWorkerTransport>()));
 19836        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, RabbitMqReplyTargetProvider>());
 19837        services.AddSingleton(provider =>
 19838        {
 19839            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 19840            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 19841            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<RabbitMqAsyncResponseOptions
 19842            return new AsyncResponseTransportMarker("RabbitMQ")
 19843            {
 19844                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == RabbitMqAckMode.AckAfterEnqueue,
 19845                WorkerAckModePath = $"{nameof(RabbitMqAsyncResponseOptions)}.{nameof(options.WorkerSubscriber)}.{nameof(
 19846                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == RabbitMqAckMode.AckAfterEnqueue,
 19847                ResponseAckModePath = $"{nameof(RabbitMqAsyncResponseOptions)}.{nameof(options.ResponseSubscriber)}.{nam
 19848            };
 19849        });
 50
 19851        services.AddHostedService<RabbitMqWorkerSubscriber>();
 19852        services.AddHostedService<RabbitMqResponseIngressSubscriber>();
 53
 19854        return builder;
 55    }
 56}