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

Information
Class: Microsoft.Extensions.DependencyInjection.SqsAsyncResponseServiceCollectionExtensions
Assembly: AsyncResponse.Transports.SQS
File(s): /_/src/Transports/AsyncResponse.Transports.SQS/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 66
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
WithSqsTransport(...)100%11100%

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.SQS;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4
 5namespace Microsoft.Extensions.DependencyInjection;
 6
 7/// <summary>DI registration for the AWS SQS AsyncResponse transport.</summary>
 8public static class SqsAsyncResponseServiceCollectionExtensions
 9{
 10    /// <summary>
 11    /// Registers AWS SQS as the worker transport and response ingress in one call:
 12    /// <list type="bullet">
 13    /// <item><description>worker jobs are published to <see cref="SqsAsyncResponseOptions.WorkerQueue"/>;</description>
 14    /// <item><description>a hosted subscriber long-polls that worker queue and executes worker jobs;</description></ite
 15    /// <item><description>a hosted subscriber long-polls <see cref="SqsAsyncResponseOptions.ResponseQueue"/> and feeds 
 16    /// </list>
 17    /// Redelivery and dead-lettering stay native: a failed handler leaves the message for the
 18    /// visibility timeout, and the queue's redrive policy moves it to the dead-letter queue after
 19    /// <c>maxReceiveCount</c> receives (provision both with
 20    /// <see cref="SqsAsyncResponseOptions.CreateQueues"/> or your infrastructure tooling). SQS is a
 21    /// transport, not a recovery store: pair it with a channel (<c>.WithInMemoryChannel()</c> for
 22    /// simple apps, or a durable channel such as <c>.WithRedisChannel()</c>,
 23    /// <c>.WithPostgreSqlChannel()</c>, or <c>.WithNatsChannel()</c> when late responses must
 24    /// survive redeploys). An application-registered <c>Amazon.SQS.IAmazonSQS</c> singleton (for
 25    /// example from <c>AWSSDK.Extensions.NETCore.Setup</c>) is reused when present.
 26    /// </summary>
 27    public static AsyncResponseRegistrationBuilder WithSqsTransport(
 28        this AsyncResponseRegistrationBuilder builder,
 29        Action<SqsAsyncResponseOptions> configure)
 30    {
 19831        ArgumentNullException.ThrowIfNull(configure);
 32
 19833        var services = builder.Services;
 19834        services.AddOptions();
 19835        services.Configure(configure);
 36
 19837        services.TryAddSingleton(SqsClientResolver.Create);
 39438        services.TryAddSingleton(provider => new SqsWorkerTransport(
 39439            provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqsAsyncResponseOptions>>(),
 39440            provider.GetRequiredService<ISqsClient>()));
 19841        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider =>
 39442            provider.GetRequiredService<SqsWorkerTransport>()));
 19843        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, SqsReplyTargetProvider>());
 19844        services.AddSingleton(provider =>
 19845        {
 19846            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 19847            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 19848            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqsAsyncResponseOptions>>().
 19849            return new AsyncResponseTransportMarker(SqsAsyncResponseOptions.TransportName)
 19850            {
 19851                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == SqsAckMode.AckAfterEnqueue,
 19852                WorkerAckModePath = $"{nameof(SqsAsyncResponseOptions)}.{nameof(options.WorkerSubscriber)}.{nameof(optio
 19853                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == SqsAckMode.AckAfterEnqueue,
 19854                ResponseAckModePath = $"{nameof(SqsAsyncResponseOptions)}.{nameof(options.ResponseSubscriber)}.{nameof(o
 19855            };
 19856        });
 57
 58        // Registered before the subscribers: hosted services start in registration order, so
 59        // CreateQueues provisioning completes before the first ReceiveMessage loop begins.
 19860        services.AddHostedService<SqsQueueProvisioningService>();
 19861        services.AddHostedService<SqsWorkerSubscriber>();
 19862        services.AddHostedService<SqsResponseIngressSubscriber>();
 63
 19864        return builder;
 65    }
 66}