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

Information
Class: Microsoft.Extensions.DependencyInjection.MongoDbAsyncResponseTransportServiceCollectionExtensions
Assembly: AsyncResponse.Transports.MongoDB
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.MongoDB/ServiceCollectionExtensions.cs
Line coverage
97%
Covered lines: 46
Uncovered lines: 1
Coverable lines: 47
Total lines: 83
Line coverage: 97.8%
Branch coverage
93%
Covered branches: 15
Total branches: 16
Branch coverage: 93.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithMongoDbTransport(...)100%88100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.MongoDB/ServiceCollectionExtensions.cs

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.MongoDB;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4using Microsoft.Extensions.Logging;
 5using Microsoft.Extensions.Options;
 6using MongoDB.Driver;
 7
 8namespace Microsoft.Extensions.DependencyInjection;
 9
 10/// <summary>DI registration for the MongoDB AsyncResponse transport package.</summary>
 11public static class MongoDbAsyncResponseTransportServiceCollectionExtensions
 12{
 13    /// <summary>
 14    /// Registers MongoDB as the worker transport and response ingress in one call:
 15    /// worker jobs are inserted into the configured worker queue, hosted subscribers claim documents
 16    /// atomically with <c>findOneAndUpdate</c>, and response documents are fed into the
 17    /// transport-neutral <see cref="IAsyncResponseIngress"/>. Hosts may register an
 18    /// <see cref="IMongoDatabase"/> (or an <see cref="IMongoClient"/> plus
 19    /// <see cref="MongoDbAsyncResponseTransportOptions.DatabaseName"/>) singleton, or set
 20    /// <see cref="MongoDbAsyncResponseTransportOptions.ConnectionString"/> here.
 21    /// </summary>
 22    public static AsyncResponseRegistrationBuilder WithMongoDbTransport(
 23        this AsyncResponseRegistrationBuilder builder,
 24        Action<MongoDbAsyncResponseTransportOptions> configure)
 25    {
 326        ArgumentNullException.ThrowIfNull(configure);
 27
 328        var services = builder.Services;
 329        services.AddOptions();
 330        services.Configure(configure);
 31
 32        // The store reuses a host-registered IMongoDatabase / IMongoClient when present; otherwise it
 33        // creates and owns a client from the options. Nothing is registered as a bare
 34        // IMongoClient/IMongoDatabase service, so unrelated resolutions of those types are never
 35        // answered — or broken — by this package.
 336        services.TryAddSingleton(provider =>
 337        {
 338            var options = provider.GetRequiredService<IOptions<MongoDbAsyncResponseTransportOptions>>();
 339            var logger = provider.GetService<ILogger<MongoDbTransportStore>>();
 340
 341            var database = provider.GetService<IMongoDatabase>();
 342            if (database is not null)
 343                return new MongoDbTransportStore(database, options, logger: logger);
 344
 245            if (string.IsNullOrWhiteSpace(options.Value.DatabaseName))
 246                throw new InvalidOperationException($"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(MongoDbAsyn
 347
 248            var sharedClient = provider.GetService<IMongoClient>();
 249            if (sharedClient is not null)
 250                return new MongoDbTransportStore(sharedClient.GetDatabase(options.Value.DatabaseName), options, logger: 
 351
 252            if (string.IsNullOrWhiteSpace(options.Value.ConnectionString))
 053                throw new InvalidOperationException($"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(MongoDbAsyn
 354
 255            var ownedClient = new MongoClient(options.Value.ConnectionString);
 356            return new MongoDbTransportStore(ownedClient.GetDatabase(options.Value.DatabaseName), options, ownedClient, 
 357        });
 58
 359        services.TryAddSingleton(provider => new MongoDbWorkerTransport(
 360            provider.GetRequiredService<IOptions<MongoDbAsyncResponseTransportOptions>>(),
 361            provider.GetRequiredService<MongoDbTransportStore>()));
 362        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider => provider.GetRequiredService<MongoDbWo
 363        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, MongoDbReplyTargetProvider>());
 364        services.AddSingleton(provider =>
 365        {
 366            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 367            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 368            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<MongoDbAsyncResponseTranspor
 369            return new AsyncResponseTransportMarker(MongoDbAsyncResponseTransportOptions.TransportName)
 370            {
 371                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == MongoDbAckMode.AckAfterEnqueue,
 372                WorkerAckModePath = $"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(options.WorkerSubscriber)}.
 373                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == MongoDbAckMode.AckAfterEnqueue,
 374                ResponseAckModePath = $"{nameof(MongoDbAsyncResponseTransportOptions)}.{nameof(options.ResponseSubscribe
 375            };
 376        });
 77
 378        services.AddHostedService<MongoDbWorkerSubscriber>();
 379        services.AddHostedService<MongoDbResponseIngressSubscriber>();
 80
 381        return builder;
 82    }
 83}