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

Information
Class: Microsoft.Extensions.DependencyInjection.PostgreSqlAsyncResponseChannelServiceCollectionExtensions
Assembly: AsyncResponse.Channels.PostgreSQL
File(s): /_/src/Channels/AsyncResponse.Channels.PostgreSQL/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 32
Uncovered lines: 0
Coverable lines: 32
Total lines: 64
Line coverage: 100%
Branch coverage
75%
Covered branches: 3
Total branches: 4
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithPostgreSqlChannel(...)75%44100%

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Channels.PostgreSQL;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4using Microsoft.Extensions.Options;
 5
 6namespace Microsoft.Extensions.DependencyInjection;
 7
 8/// <summary>DI registration for the PostgreSQL-backed AsyncResponse channel package.</summary>
 9public static class PostgreSqlAsyncResponseChannelServiceCollectionExtensions
 10{
 11    /// <summary>
 12    /// Registers PostgreSQL <c>LISTEN/NOTIFY</c> as the response channel — behind
 13    /// <see cref="IAsyncResponsePublisher"/>, <see cref="IAsyncResponseSubscriber"/>, and
 14    /// <see cref="IRecoverableAsyncResponseSubscriber"/> — together with the durable PostgreSQL
 15    /// recovery-state store. The host must register a shared <see cref="Npgsql.NpgsqlDataSource"/>
 16    /// singleton, typically from the application's existing PostgreSQL connection string.
 17    /// </summary>
 18    public static AsyncResponseRegistrationBuilder WithPostgreSqlChannel(
 19        this AsyncResponseRegistrationBuilder builder,
 20        Action<PostgreSqlAsyncResponseChannelOptions>? configure = null)
 21    {
 37622        var services = builder.Services;
 37623        services.AddOptions();
 37624        if (configure is not null)
 37225            services.Configure(configure);
 26
 37627        services.TryAddSingleton<PostgreSqlChannelSql>();
 28
 37629        services.TryAddSingleton<PostgreSqlRecoveryStateStore>();
 74830        services.Replace(ServiceDescriptor.Singleton<IRecoveryStateStore>(provider => provider.GetRequiredService<Postgr
 70831        services.Replace(ServiceDescriptor.Singleton<IRecoveryStateScanner>(provider => provider.GetRequiredService<Post
 32
 37633        services.TryAddSingleton<PostgreSqlAsyncResponseChannel>();
 73734        services.Replace(ServiceDescriptor.Singleton<IAsyncResponsePublisher>(provider => provider.GetRequiredService<Po
 69035        services.Replace(ServiceDescriptor.Singleton<IRawAsyncResponsePublisher>(provider => provider.GetRequiredService
 74136        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseSubscriber>(provider => provider.GetRequiredService<P
 70937        services.Replace(ServiceDescriptor.Singleton<IRecoverableAsyncResponseSubscriber>(provider => provider.GetRequir
 71538        services.Replace(ServiceDescriptor.Singleton<IActiveSubscriberProbe>(provider => provider.GetRequiredService<Pos
 39
 70840        services.Replace(ServiceDescriptor.Singleton<IRecoverableAsyncResponseBuilder>(provider => new RecoverableAsyncR
 70841            provider.GetRequiredService<IRecoverableAsyncResponseSubscriber>(),
 70842            provider.GetService<IWorkerTransport>(),
 70843            provider.GetService<IAsyncResponseReplyTargetProvider>(),
 70844            provider.GetRequiredService<AsyncResponseContextPropagation>(),
 70845            provider.GetService<TimeProvider>(),
 70846            // The producer-side mirror of the ingress's inbound size budget (WorkerJobTooLargeException).
 70847            provider.GetService<IOptions<AsyncResponseOptions>>())));
 70848        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseBuilder>(provider => provider.GetRequiredService<IRec
 49
 50        // The resolved default waiter timeout is declared through the marker so the startup
 51        // validator can require the durable-flow ledger TTL to out-live a timeout-less awaited
 52        // step, and the flow engine can extend a parked ledger by it — without either referencing
 53        // channel option types.
 37654        services.AddSingleton(provider =>
 37655        {
 33456            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<PostgreSqlAsyncResponseChann
 33457            return new AsyncResponseChannelMarker(PostgreSqlAsyncResponseChannelOptions.ChannelName)
 33458            {
 33459                EffectiveDefaultWaitTimeout = options.DefaultTimeout ?? options.RecoveryStateExpiry
 33460            };
 37661        });
 37662        return builder;
 63    }
 64}