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

Information
Class: Microsoft.Extensions.DependencyInjection.RedisAsyncResponseTransportServiceCollectionExtensions
Assembly: AsyncResponse.Transports.Redis
File(s): /_/src/Transports/AsyncResponse.Transports.Redis/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 24
Uncovered lines: 0
Coverable lines: 24
Total lines: 60
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
WithRedisTransport(...)100%11100%

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.Redis;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4
 5namespace Microsoft.Extensions.DependencyInjection;
 6
 7/// <summary>
 8/// DI registration for the Redis Streams AsyncResponse transport.
 9/// </summary>
 10public static class RedisAsyncResponseTransportServiceCollectionExtensions
 11{
 12    /// <summary>
 13    /// Registers Redis Streams as the worker transport and response ingress in one call:
 14    /// <list type="bullet">
 15    /// <item><description>worker jobs are XADDed to the configured worker stream;</description></item>
 16    /// <item><description>a hosted consumer group subscriber reads worker entries and executes jobs;</description></ite
 17    /// <item><description>a hosted consumer group subscriber reads response entries and feeds them into <see cref="IAsy
 18    /// </list>
 19    /// Redis Streams is a transport, not the waiter/recovery channel. Pair it with
 20    /// <c>.WithRedisChannel()</c> when late responses must survive redeploys, or with
 21    /// <c>.WithInMemoryChannel()</c> for simple single-process waits.
 22    /// <para>
 23    /// Requires a <c>StackExchange.Redis.IConnectionMultiplexer</c> singleton registered by the
 24    /// host. Reuse the same multiplexer as the Redis channel package when both are installed.
 25    /// </para>
 26    /// </summary>
 27    public static AsyncResponseRegistrationBuilder WithRedisTransport(
 28        this AsyncResponseRegistrationBuilder builder,
 29        Action<RedisAsyncResponseTransportOptions> configure)
 30    {
 19931        ArgumentNullException.ThrowIfNull(configure);
 32
 19733        var services = builder.Services;
 19734        services.AddOptions();
 19735        services.Configure(configure);
 36
 19737        services.TryAddSingleton<RedisWorkerTransport>();
 19738        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider =>
 39239            provider.GetRequiredService<RedisWorkerTransport>()));
 19740        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, RedisReplyTargetProvider>());
 19741        services.AddSingleton(provider =>
 19742        {
 19743            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 19744            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 19745            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<RedisAsyncResponseTransportO
 19746            return new AsyncResponseTransportMarker("Redis")
 19747            {
 19748                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == RedisAckMode.AckAfterEnqueue,
 19749                WorkerAckModePath = $"{nameof(RedisAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber)}.{n
 19750                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == RedisAckMode.AckAfterEnqueue,
 19751                ResponseAckModePath = $"{nameof(RedisAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscriber)
 19752            };
 19753        });
 54
 19755        services.AddHostedService<RedisWorkerSubscriber>();
 19756        services.AddHostedService<RedisResponseIngressSubscriber>();
 57
 19758        return builder;
 59    }
 60}