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

Information
Class: Microsoft.Extensions.DependencyInjection.SqlServerAsyncResponseTransportServiceCollectionExtensions
Assembly: AsyncResponse.Transports.SqlServer
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.SqlServer/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 24
Uncovered lines: 0
Coverable lines: 24
Total lines: 51
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
WithSqlServerTransport(...)100%44100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/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    {
 322        ArgumentNullException.ThrowIfNull(configure);
 23
 324        var services = builder.Services;
 325        services.AddOptions();
 326        services.Configure(configure);
 27
 328        services.TryAddSingleton<SqlServerTransportStore>();
 329        services.TryAddSingleton<SqlServerWorkerTransport>();
 330        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider => provider.GetRequiredService<SqlServer
 331        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, SqlServerReplyTargetProvider>())
 332        services.AddSingleton(provider =>
 333        {
 334            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 335            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 336            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqlServerAsyncResponseTransp
 337            return new AsyncResponseTransportMarker(SqlServerAsyncResponseTransportOptions.TransportName)
 338            {
 339                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == SqlServerAckMode.AckAfterEnqueue,
 340                WorkerAckModePath = $"{nameof(SqlServerAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber)
 341                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == SqlServerAckMode.AckAfterEnqueue,
 342                ResponseAckModePath = $"{nameof(SqlServerAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscri
 343            };
 344        });
 45
 346        services.AddHostedService<SqlServerWorkerSubscriber>();
 347        services.AddHostedService<SqlServerResponseIngressSubscriber>();
 48
 349        return builder;
 50    }
 51}