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

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

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.PostgreSQL;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4
 5namespace Microsoft.Extensions.DependencyInjection;
 6
 7/// <summary>DI registration for the PostgreSQL AsyncResponse transport package.</summary>
 8public static class PostgreSqlAsyncResponseTransportServiceCollectionExtensions
 9{
 10    /// <summary>
 11    /// Registers PostgreSQL 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>FOR UPDATE SKIP LOCKED</c>, and response rows are fed into the transport-neutral
 14    /// <see cref="IAsyncResponseIngress"/>. The host must register a shared
 15    /// <see cref="Npgsql.NpgsqlDataSource"/> singleton.
 16    /// </summary>
 17    public static AsyncResponseRegistrationBuilder WithPostgreSqlTransport(
 18        this AsyncResponseRegistrationBuilder builder,
 19        Action<PostgreSqlAsyncResponseTransportOptions> configure)
 20    {
 21021        ArgumentNullException.ThrowIfNull(configure);
 22
 20823        var services = builder.Services;
 20824        services.AddOptions();
 20825        services.Configure(configure);
 26
 20827        services.TryAddSingleton<PostgreSqlTransportStore>();
 28        // Factory registration so the transport shares the singleton store: DI would otherwise
 29        // pick the public constructor (internal ctors are invisible to it), giving the publisher
 30        // a private store whose in-process MessagePublished event the subscribers never observe —
 31        // silently downgrading every same-process publish from instant wake to poll-interval
 32        // latency. Mirrors the MongoDB transport's factory registration.
 40433        services.TryAddSingleton(provider => new PostgreSqlWorkerTransport(
 40434            provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<PostgreSqlAsyncResponseTransportOptions>>(
 40435            provider.GetRequiredService<PostgreSqlTransportStore>()));
 40436        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider => provider.GetRequiredService<PostgreSq
 20837        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, PostgreSqlReplyTargetProvider>()
 20838        services.AddSingleton(provider =>
 20839        {
 20840            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 20841            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 20642            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<PostgreSqlAsyncResponseTrans
 20643            return new AsyncResponseTransportMarker(PostgreSqlAsyncResponseTransportOptions.TransportName)
 20644            {
 20645                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == PostgreSqlAckMode.AckAfterEnqueue,
 20646                WorkerAckModePath = $"{nameof(PostgreSqlAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber
 20647                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == PostgreSqlAckMode.AckAfterEnqueue
 20648                ResponseAckModePath = $"{nameof(PostgreSqlAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscr
 20649            };
 20850        });
 51
 20852        services.AddHostedService<PostgreSqlWorkerSubscriber>();
 20853        services.AddHostedService<PostgreSqlResponseIngressSubscriber>();
 54
 20855        return builder;
 56    }
 57}