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

Information
Class: Microsoft.Extensions.DependencyInjection.SqlServerAsyncResponseChannelServiceCollectionExtensions
Assembly: AsyncResponse.Channels.SqlServer
File(s): /_/src/Channels/AsyncResponse.Channels.SqlServer/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 32
Uncovered lines: 0
Coverable lines: 32
Total lines: 67
Line coverage: 100%
Branch coverage
50%
Covered branches: 2
Total branches: 4
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithSqlServerChannel(...)50%44100%

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Channels.SqlServer;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4using Microsoft.Extensions.Options;
 5
 6namespace Microsoft.Extensions.DependencyInjection;
 7
 8/// <summary>DI registration for the Microsoft SQL Server-backed AsyncResponse channel package.</summary>
 9public static class SqlServerAsyncResponseChannelServiceCollectionExtensions
 10{
 11    /// <summary>
 12    /// Registers SQL Server as the response channel — behind
 13    /// <see cref="IAsyncResponsePublisher"/>, <see cref="IAsyncResponseSubscriber"/>, and
 14    /// <see cref="IRecoverableAsyncResponseSubscriber"/> — together with the durable SQL Server
 15    /// recovery-state store. Active waiters are woken by an adaptive polling sweep (tight while
 16    /// waiters are subscribed, backed off while idle) because SQL Server has no
 17    /// <c>LISTEN/NOTIFY</c>; same-process deliveries bypass the sweep entirely. Configure
 18    /// <see cref="SqlServerAsyncResponseChannelOptions.ConnectionString"/> with the application's
 19    /// SQL Server database.
 20    /// </summary>
 21    public static AsyncResponseRegistrationBuilder WithSqlServerChannel(
 22        this AsyncResponseRegistrationBuilder builder,
 23        Action<SqlServerAsyncResponseChannelOptions>? configure = null)
 24    {
 37925        var services = builder.Services;
 37926        services.AddOptions();
 37927        if (configure is not null)
 37928            services.Configure(configure);
 29
 37930        services.TryAddSingleton<SqlServerChannelSql>();
 31
 37932        services.TryAddSingleton<SqlServerRecoveryStateStore>();
 75433        services.Replace(ServiceDescriptor.Singleton<IRecoveryStateStore>(provider => provider.GetRequiredService<SqlSer
 71134        services.Replace(ServiceDescriptor.Singleton<IRecoveryStateScanner>(provider => provider.GetRequiredService<SqlS
 35
 37936        services.TryAddSingleton<SqlServerAsyncResponseChannel>();
 74237        services.Replace(ServiceDescriptor.Singleton<IAsyncResponsePublisher>(provider => provider.GetRequiredService<Sq
 69338        services.Replace(ServiceDescriptor.Singleton<IRawAsyncResponsePublisher>(provider => provider.GetRequiredService
 74639        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseSubscriber>(provider => provider.GetRequiredService<S
 71240        services.Replace(ServiceDescriptor.Singleton<IRecoverableAsyncResponseSubscriber>(provider => provider.GetRequir
 71841        services.Replace(ServiceDescriptor.Singleton<IActiveSubscriberProbe>(provider => provider.GetRequiredService<Sql
 42
 71143        services.Replace(ServiceDescriptor.Singleton<IRecoverableAsyncResponseBuilder>(provider => new RecoverableAsyncR
 71144            provider.GetRequiredService<IRecoverableAsyncResponseSubscriber>(),
 71145            provider.GetService<IWorkerTransport>(),
 71146            provider.GetService<IAsyncResponseReplyTargetProvider>(),
 71147            provider.GetRequiredService<AsyncResponseContextPropagation>(),
 71148            provider.GetService<TimeProvider>(),
 71149            // The producer-side mirror of the ingress's inbound size budget (WorkerJobTooLargeException).
 71150            provider.GetService<IOptions<AsyncResponseOptions>>())));
 71151        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseBuilder>(provider => provider.GetRequiredService<IRec
 52
 53        // The resolved default waiter timeout is declared through the marker so the startup
 54        // validator can require the durable-flow ledger TTL to out-live a timeout-less awaited
 55        // step, and the flow engine can extend a parked ledger by it — without either referencing
 56        // channel option types.
 37957        services.AddSingleton(provider =>
 37958        {
 33459            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqlServerAsyncResponseChanne
 33460            return new AsyncResponseChannelMarker(SqlServerAsyncResponseChannelOptions.ChannelName)
 33461            {
 33462                EffectiveDefaultWaitTimeout = options.DefaultTimeout ?? options.RecoveryStateExpiry
 33463            };
 37964        });
 37965        return builder;
 66    }
 67}