< Summary

Information
Class: ArturRios.Data.DynamoDb.DependencyInjection.ServiceCollectionExtensions
Assembly: ArturRios.Data.DynamoDb
File(s): /home/runner/work/dotnet-data/dotnet-data/src/ArturRios.Data.DynamoDb/DependencyInjection/ServiceCollectionExtensions.cs
Line coverage
85%
Covered lines: 17
Uncovered lines: 3
Coverable lines: 20
Total lines: 77
Line coverage: 85%
Branch coverage
44%
Covered branches: 8
Total branches: 18
Branch coverage: 44.4%
Method coverage
66%
Covered methods: 2
Fully covered methods: 1
Total methods: 3
Method coverage: 66.6%
Full method coverage: 33.3%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CreateClient(...)50%161690.9%
AddDynamoData(...)0%620%
AddDynamoData(...)100%11100%

File(s)

/home/runner/work/dotnet-data/dotnet-data/src/ArturRios.Data.DynamoDb/DependencyInjection/ServiceCollectionExtensions.cs

#LineLine coverage
 1using Amazon;
 2using Amazon.DynamoDBv2;
 3using Amazon.DynamoDBv2.DataModel;
 4using Amazon.Runtime;
 5using ArturRios.Data.DynamoDb.Configuration;
 6using ArturRios.Data.DynamoDb.Interfaces;
 7using ArturRios.Data.DynamoDb.Repositories;
 8using Microsoft.Extensions.Configuration;
 9using Microsoft.Extensions.DependencyInjection;
 10
 11namespace ArturRios.Data.DynamoDb.DependencyInjection;
 12
 13/// <summary>Dependency-injection registration for the ArturRios.Data.DynamoDb store.</summary>
 14public static class ServiceCollectionExtensions
 15{
 16    /// <summary>Builds an <see cref="IAmazonDynamoDB" /> client from the given options.</summary>
 17    /// <param name="options">The DynamoDB options.</param>
 18    private static IAmazonDynamoDB CreateClient(DynamoOptions options)
 19    {
 620        var hasKeys = !string.IsNullOrEmpty(options.AccessKey) && !string.IsNullOrEmpty(options.SecretKey);
 621        var credentials = hasKeys ? new BasicAWSCredentials(options.AccessKey, options.SecretKey) : null;
 22
 623        if (!string.IsNullOrEmpty(options.ServiceUrl))
 24        {
 425            var config = new AmazonDynamoDBConfig { ServiceURL = options.ServiceUrl };
 26
 427            if (!string.IsNullOrEmpty(options.Region))
 28            {
 429                config.AuthenticationRegion = options.Region;
 30            }
 31
 432            return new AmazonDynamoDBClient(credentials ?? new BasicAWSCredentials("dummy", "dummy"), config);
 33        }
 34
 35        // no ServiceUrl -> real AWS
 236        if (string.IsNullOrEmpty(options.Region))
 37        {
 38            // Defer region resolution to the SDK's default chain (env / profile / instance metadata).
 039            return credentials is null ? new AmazonDynamoDBClient() : new AmazonDynamoDBClient(credentials);
 40        }
 41
 242        var region = RegionEndpoint.GetBySystemName(options.Region);
 243        return credentials is null ? new AmazonDynamoDBClient(region) : new AmazonDynamoDBClient(credentials, region);
 44    }
 45
 46    /// <param name="services">The service collection.</param>
 47    extension(IServiceCollection services)
 48    {
 49        /// <summary>Registers the DynamoDB store, binding options from configuration.</summary>
 50        /// <param name="configuration">Application configuration.</param>
 51        /// <param name="sectionName">Configuration section holding the options. Defaults to "ArturRios.Data.DynamoDb".<
 52        public IServiceCollection AddDynamoData(IConfiguration configuration,
 53            string sectionName = "ArturRios.Data.DynamoDb")
 54        {
 055            var options = configuration.GetSection(sectionName).Get<DynamoOptions>() ?? new DynamoOptions();
 056            return services.AddDynamoData(options);
 57        }
 58
 59        /// <summary>
 60        ///     Registers the DynamoDB store from an explicit options instance.
 61        ///     Failures are logged in full when logging is registered (<c>AddLogging</c>); without
 62        ///     it the repositories still run and error envelopes carry no service text.
 63        /// </summary>
 64        /// <param name="options">The DynamoDB options.</param>
 65        public IServiceCollection AddDynamoData(DynamoOptions options)
 66        {
 1267            services.AddSingleton<IAmazonDynamoDB>(_ => CreateClient(options));
 668            services.AddSingleton<IDynamoDBContext>(sp =>
 1069                new DynamoDBContextBuilder()
 1070                    .WithDynamoDBClient(sp.GetRequiredService<IAmazonDynamoDB>)
 1071                    .Build());
 672            services.AddScoped(typeof(IAsyncDynamoRepository<>), typeof(DynamoRepository<>));
 73
 674            return services;
 75        }
 76    }
 77}