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

Information
Class: Microsoft.Extensions.DependencyInjection.RedisAsyncResponseTransportServiceCollectionExtensions
Assembly: AsyncResponse.Transports.Redis
File(s): /home/runner/work/AsyncResponse/AsyncResponse/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
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithRedisTransport(...)100%44100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/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    {
 331        ArgumentNullException.ThrowIfNull(configure);
 32
 333        var services = builder.Services;
 334        services.AddOptions();
 335        services.Configure(configure);
 36
 337        services.TryAddSingleton<RedisWorkerTransport>();
 338        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider =>
 339            provider.GetRequiredService<RedisWorkerTransport>()));
 340        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, RedisReplyTargetProvider>());
 341        services.AddSingleton(provider =>
 342        {
 343            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 344            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 345            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<RedisAsyncResponseTransportO
 346            return new AsyncResponseTransportMarker("Redis")
 347            {
 348                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == RedisAckMode.AckAfterEnqueue,
 349                WorkerAckModePath = $"{nameof(RedisAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber)}.{n
 350                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == RedisAckMode.AckAfterEnqueue,
 351                ResponseAckModePath = $"{nameof(RedisAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscriber)
 352            };
 353        });
 54
 355        services.AddHostedService<RedisWorkerSubscriber>();
 356        services.AddHostedService<RedisResponseIngressSubscriber>();
 57
 358        return builder;
 59    }
 60}