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

Information
Class: Microsoft.Extensions.DependencyInjection.MongoDbAsyncResponseTransportServiceCollectionExtensions
Assembly: AsyncResponse.Transports.MongoDB
File(s): /_/src/Transports/AsyncResponse.Transports.MongoDB/ServiceCollectionExtensions.cs
Line coverage
97%
Covered lines: 48
Uncovered lines: 1
Coverable lines: 49
Total lines: 86
Line coverage: 97.9%
Branch coverage
87%
Covered branches: 7
Total branches: 8
Branch coverage: 87.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithMongoDbTransport(...)87.5%8897.95%

File(s)

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

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Internal;
 3using AsyncResponse.Transports.MongoDB;
 4using Microsoft.Extensions.DependencyInjection.Extensions;
 5using Microsoft.Extensions.Logging;
 6using Microsoft.Extensions.Options;
 7using MongoDB.Driver;
 8
 9namespace Microsoft.Extensions.DependencyInjection;
 10
 11/// <summary>DI registration for the MongoDB AsyncResponse transport package.</summary>
 12public static class MongoDbAsyncResponseTransportServiceCollectionExtensions
 13{
 14    /// <summary>
 15    /// Registers MongoDB as the worker transport and response ingress in one call:
 16    /// worker jobs are inserted into the configured worker queue, hosted subscribers claim documents
 17    /// atomically with <c>findOneAndUpdate</c>, and response documents are fed into the
 18    /// transport-neutral <see cref="IAsyncResponseIngress"/>. Hosts may register an
 19    /// <see cref="IMongoDatabase"/> (or an <see cref="IMongoClient"/> plus
 20    /// <see cref="MongoDbAsyncResponseTransportOptions.DatabaseName"/>) singleton, or set
 21    /// <see cref="MongoDbAsyncResponseTransportOptions.ConnectionString"/> here.
 22    /// </summary>
 23    public static AsyncResponseRegistrationBuilder WithMongoDbTransport(
 24        this AsyncResponseRegistrationBuilder builder,
 25        Action<MongoDbAsyncResponseTransportOptions> configure)
 26    {
 21227        ArgumentNullException.ThrowIfNull(configure);
 28
 21029        var services = builder.Services;
 21030        services.AddOptions();
 21031        services.Configure(configure);
 32
 33        // The store reuses a host-registered IMongoDatabase / IMongoClient when present; otherwise it
 34        // creates and owns a client from the options. Nothing is registered as a bare
 35        // IMongoClient/IMongoDatabase service, so unrelated resolutions of those types are never
 36        // answered — or broken — by this package.
 21037        services.TryAddSingleton<IMongoNamespaceRegistry, MongoNamespaceRegistry>();
 21038        services.TryAddSingleton(provider =>
 21039        {
 20440            var options = provider.GetRequiredService<IOptions<MongoDbAsyncResponseTransportOptions>>();
 20441            var logger = provider.GetService<ILogger<MongoDbTransportStore>>();
 20442            var registry = provider.GetRequiredService<IMongoNamespaceRegistry>();
 21043
 20444            var database = provider.GetService<IMongoDatabase>();
 20445            if (database is not null)
 19846                return new MongoDbTransportStore(database, options, logger: logger, namespaceRegistry: registry);
 21047
 648            if (string.IsNullOrWhiteSpace(options.Value.DatabaseName))
 249                throw new InvalidOperationException($"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(MongoDbAsyn
 21050
 451            var sharedClient = provider.GetService<IMongoClient>();
 452            if (sharedClient is not null)
 253                return new MongoDbTransportStore(sharedClient.GetDatabase(options.Value.DatabaseName), options, logger: 
 21054
 255            if (string.IsNullOrWhiteSpace(options.Value.ConnectionString))
 056                throw new InvalidOperationException($"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(MongoDbAsyn
 21057
 258            var ownedClient = new MongoClient(options.Value.ConnectionString);
 259            return new MongoDbTransportStore(ownedClient.GetDatabase(options.Value.DatabaseName), options, ownedClient, 
 21060        });
 61
 40662        services.TryAddSingleton(provider => new MongoDbWorkerTransport(
 40663            provider.GetRequiredService<IOptions<MongoDbAsyncResponseTransportOptions>>(),
 40664            provider.GetRequiredService<MongoDbTransportStore>()));
 40665        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider => provider.GetRequiredService<MongoDbWo
 21066        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, MongoDbReplyTargetProvider>());
 21067        services.AddSingleton(provider =>
 21068        {
 21069            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 21070            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 20071            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<MongoDbAsyncResponseTranspor
 20072            return new AsyncResponseTransportMarker(MongoDbAsyncResponseTransportOptions.TransportName)
 20073            {
 20074                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == MongoDbAckMode.AckAfterEnqueue,
 20075                WorkerAckModePath = $"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber)}.
 20076                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == MongoDbAckMode.AckAfterEnqueue,
 20077                ResponseAckModePath = $"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscribe
 20078            };
 21079        });
 80
 21081        services.AddHostedService<MongoDbWorkerSubscriber>();
 21082        services.AddHostedService<MongoDbResponseIngressSubscriber>();
 83
 21084        return builder;
 85    }
 86}