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

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

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/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    {
 321        ArgumentNullException.ThrowIfNull(configure);
 22
 323        var services = builder.Services;
 324        services.AddOptions();
 325        services.Configure(configure);
 26
 327        services.TryAddSingleton<PostgreSqlTransportStore>();
 328        services.TryAddSingleton<PostgreSqlWorkerTransport>();
 329        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider => provider.GetRequiredService<PostgreSq
 330        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, PostgreSqlReplyTargetProvider>()
 331        services.AddSingleton(provider =>
 332        {
 333            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 334            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 335            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<PostgreSqlAsyncResponseTrans
 336            return new AsyncResponseTransportMarker(PostgreSqlAsyncResponseTransportOptions.TransportName)
 337            {
 338                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == PostgreSqlAckMode.AckAfterEnqueue,
 339                WorkerAckModePath = $"{nameof(PostgreSqlAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber
 340                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == PostgreSqlAckMode.AckAfterEnqueue
 341                ResponseAckModePath = $"{nameof(PostgreSqlAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscr
 342            };
 343        });
 44
 345        services.AddHostedService<PostgreSqlWorkerSubscriber>();
 346        services.AddHostedService<PostgreSqlResponseIngressSubscriber>();
 47
 348        return builder;
 49    }
 50}