< Summary

Information
Class: ProjectTemplate.Infrastructure.Data.Extensions.InfrastructureDataAccessServiceExtensions
Assembly: ProjectTemplate.Infrastructure
File(s): /home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Infrastructure/Data/Extensions/InfrastructureDataAccessServiceExtensions.cs
Line coverage
100%
Covered lines: 59
Uncovered lines: 0
Coverable lines: 59
Total lines: 136
Line coverage: 100%
Branch coverage
84%
Covered branches: 22
Total branches: 26
Branch coverage: 84.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddApplicationInfrastructureDataAccess(...)100%44100%
ResolveDataAccessRegistration(...)77.77%1818100%
ConfigureProvider(...)100%44100%
get_Provider()100%11100%
get_ConnectionString()100%11100%
get_IsDisabled()100%11100%
Enabled(...)100%11100%
Disabled(...)100%11100%

File(s)

/home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Infrastructure/Data/Extensions/InfrastructureDataAccessServiceExtensions.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Configuration;
 3using Microsoft.Extensions.DependencyInjection;
 4using Microsoft.Extensions.DependencyInjection.Extensions;
 5using ProjectTemplate.Infrastructure.Data.ExternalLogins;
 6using ProjectTemplate.Infrastructure.Data.Options;
 7
 8namespace ProjectTemplate.Infrastructure.Data.Extensions;
 9
 10/// <summary>
 11/// Provides infrastructure-owned service registration methods for application data access.
 12/// </summary>
 13public static class InfrastructureDataAccessServiceExtensions
 14{
 15    /// <summary>
 16    /// Registers EF Core data access services for infrastructure and non-web consumers.
 17    /// </summary>
 18    public static IServiceCollection AddApplicationInfrastructureDataAccess(
 19        this IServiceCollection services,
 20        IConfiguration configuration)
 21    {
 19222        ArgumentNullException.ThrowIfNull(services);
 19223        ArgumentNullException.ThrowIfNull(configuration);
 24
 19225        services
 19226            .AddOptions<DataAccessOptions>()
 19227            .Bind(configuration.GetSection(DataAccessOptions.SectionName))
 27628            .Validate(options => !string.IsNullOrWhiteSpace(options.Provider),
 19229                "ProjectTemplate:DataAccess:Provider must not be empty.")
 27630            .Validate(options => DataAccessOptions.IsDisabledProvider(options.Provider)
 27631                || !string.IsNullOrWhiteSpace(options.ConnectionStringName),
 19232                "ProjectTemplate:DataAccess:ConnectionStringName must not be empty when data access is enabled.")
 19233            .ValidateOnStart();
 34
 19235        DataAccessRegistration registration = ResolveDataAccessRegistration(configuration);
 36
 18237        if (registration.IsDisabled)
 38        {
 1239            return services;
 40        }
 41
 17042        services.TryAddScoped<ICurrentActorAccessor, SystemCurrentActorAccessor>();
 43
 18644        services.AddDbContext<ApplicationDbContext>(options => ConfigureProvider(
 18645                options,
 18646                registration.Provider,
 18647                registration.ConnectionString));
 48
 17049        services.AddDbContextFactory<ApplicationDbContext>(
 1450            options => ConfigureProvider(
 1451                    options,
 1452                    registration.Provider,
 1453                    registration.ConnectionString),
 17054            ServiceLifetime.Scoped);
 55
 17056        services.TryAddScoped<IExternalLoginAccountResolver, EfCoreExternalLoginAccountResolver>();
 57
 17058        return services;
 59    }
 60
 61    private static DataAccessRegistration ResolveDataAccessRegistration(
 62        IConfiguration configuration)
 63    {
 19264        DataAccessOptions dataAccessOptions = configuration
 19265            .GetSection(DataAccessOptions.SectionName)
 19266            .Get<DataAccessOptions>() ?? new DataAccessOptions();
 67
 19268        string provider = dataAccessOptions.Provider?.Trim() ?? string.Empty;
 19269        string connectionStringName = dataAccessOptions.ConnectionStringName?.Trim() ?? string.Empty;
 70
 19271        if (string.IsNullOrWhiteSpace(provider))
 72        {
 473            throw new InvalidOperationException(
 474                "Application data access provider was not configured.");
 75        }
 76
 18877        if (DataAccessOptions.IsDisabledProvider(provider))
 78        {
 1279            return DataAccessRegistration.Disabled(provider);
 80        }
 81
 17682        if (string.IsNullOrWhiteSpace(connectionStringName))
 83        {
 484            throw new InvalidOperationException(
 485                "Application data access connection string name was not configured.");
 86        }
 87
 17288        string connectionString = configuration.GetConnectionString(connectionStringName)
 17289            ?? throw new InvalidOperationException(
 17290                $"Connection string '{connectionStringName}' was not configured.");
 91
 17092        return DataAccessRegistration.Enabled(
 17093            provider,
 17094            connectionString);
 95    }
 96
 97    private static void ConfigureProvider(
 98        DbContextOptionsBuilder options,
 99        string provider,
 100        string connectionString)
 101    {
 30102        if (provider.Equals(DataAccessOptions.SqliteProvider, StringComparison.OrdinalIgnoreCase))
 103        {
 16104            options.UseSqlite(connectionString);
 16105            return;
 106        }
 107
 14108        if (provider.Equals(DataAccessOptions.SqlServerProvider, StringComparison.OrdinalIgnoreCase))
 109        {
 12110            options.UseSqlServer(connectionString);
 12111            return;
 112        }
 113
 2114        throw new InvalidOperationException(
 2115            $"Unsupported data access provider '{provider}'. Supported providers: {DataAccessOptions.SqliteProvider}, {D
 116    }
 117
 118    private readonly record struct DataAccessRegistration(
 30119        string Provider,
 30120        string ConnectionString,
 182121        bool IsDisabled)
 122    {
 123        public static DataAccessRegistration Enabled(
 124            string provider,
 125            string connectionString)
 126        {
 170127            return new DataAccessRegistration(provider, connectionString, false);
 128        }
 129
 130        public static DataAccessRegistration Disabled(
 131            string provider)
 132        {
 12133            return new DataAccessRegistration(provider, string.Empty, true);
 134        }
 135    }
 136}