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

Information
Class: Microsoft.Extensions.DependencyInjection.SqlServerAsyncResponseTransportServiceCollectionExtensions
Assembly: AsyncResponse.Transports.SqlServer
File(s): /_/src/Transports/AsyncResponse.Transports.SqlServer/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 26
Uncovered lines: 0
Coverable lines: 26
Total lines: 58
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
WithSqlServerTransport(...)100%11100%

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.SqlServer;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4
 5namespace Microsoft.Extensions.DependencyInjection;
 6
 7/// <summary>DI registration for the Microsoft SQL Server AsyncResponse transport package.</summary>
 8public static class SqlServerAsyncResponseTransportServiceCollectionExtensions
 9{
 10    /// <summary>
 11    /// Registers SQL Server as the worker transport and response ingress in one call:
 12    /// worker jobs are inserted into the configured worker queue, hosted subscribers claim rows with
 13    /// <c>UPDLOCK, ROWLOCK, READPAST</c> (SQL Server's <c>SKIP LOCKED</c> equivalent), and response
 14    /// rows are fed into the transport-neutral <see cref="IAsyncResponseIngress"/>. Configure
 15    /// <see cref="SqlServerAsyncResponseTransportOptions.ConnectionString"/> with the application's
 16    /// SQL Server database.
 17    /// </summary>
 18    public static AsyncResponseRegistrationBuilder WithSqlServerTransport(
 19        this AsyncResponseRegistrationBuilder builder,
 20        Action<SqlServerAsyncResponseTransportOptions> configure)
 21    {
 20422        ArgumentNullException.ThrowIfNull(configure);
 23
 20224        var services = builder.Services;
 20225        services.AddOptions();
 20226        services.Configure(configure);
 27
 20228        services.TryAddSingleton<SqlServerTransportStore>();
 29        // Factory registration so the transport shares the singleton store: DI would otherwise
 30        // pick the public one-arg constructor (internal ctors are invisible to it), giving the
 31        // publisher a private store whose in-process MessagePublished event the subscribers never
 32        // observe — silently downgrading every same-process publish from instant wake to
 33        // poll-interval latency.
 39834        services.TryAddSingleton(provider => new SqlServerWorkerTransport(
 39835            provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqlServerAsyncResponseTransportOptions>>()
 39836            provider.GetRequiredService<SqlServerTransportStore>()));
 39837        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider => provider.GetRequiredService<SqlServer
 20238        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, SqlServerReplyTargetProvider>())
 20239        services.AddSingleton(provider =>
 20240        {
 20241            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 20242            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 20043            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqlServerAsyncResponseTransp
 20044            return new AsyncResponseTransportMarker(SqlServerAsyncResponseTransportOptions.TransportName)
 20045            {
 20046                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == SqlServerAckMode.AckAfterEnqueue,
 20047                WorkerAckModePath = $"{nameof(SqlServerAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber)
 20048                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == SqlServerAckMode.AckAfterEnqueue,
 20049                ResponseAckModePath = $"{nameof(SqlServerAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscri
 20050            };
 20251        });
 52
 20253        services.AddHostedService<SqlServerWorkerSubscriber>();
 20254        services.AddHostedService<SqlServerResponseIngressSubscriber>();
 55
 20256        return builder;
 57    }
 58}