onebeyond/onebeyond-studio-core

View on GitHub
src/OneBeyond.Studio.EntityAuditing/OneBeyond.Studio.EntityAuditing.SqlServer/DependencyInjection/ServiceCollectionExtensions.cs

Summary

Maintainability
A
0 mins
Test Coverage
using EnsureThat;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using OneBeyond.Studio.DataAccess.EFCore.DependencyInjection;
using OneBeyond.Studio.DataAccess.EFCore.Options;
using OneBeyond.Studio.EntityAuditing.Domain;
using OneBeyond.Studio.EntityAuditing.Infrastructure.DependencyInjection;
using OneBeyond.Studio.EntityAuditing.Infrastructure.Initialisation;
using OneBeyond.Studio.EntityAuditing.SqlServer.DependencyInjection;
using OneBeyond.Studio.EntityAuditing.SqlServer.Initialisation;
using OneBeyond.Studio.EntityAuditing.SqlServer.Options;

namespace OneBeyond.Studio.EntityAuditing.SqlServer.DependencyInjection;

public static class ServiceCollectionExtensions
{
    /// <summary>
    /// Specifies SQL Server as implementation for the Audit Manager
    /// </summary>
    /// <param name="entityAuditingBuilder"></param>
    /// <param name="options"></param>
    /// <returns></returns>
    public static IAuditingBuilder UseSqlServer(
        this IAuditingBuilder entityAuditingBuilder,
        SqlEntityAuditingOptions options)
    {
        EnsureArg.IsNotNull(entityAuditingBuilder, nameof(entityAuditingBuilder));
        EnsureArg.IsNotNull(options, nameof(options));

        var services = entityAuditingBuilder.Services;

        services.AddDataAccess<AuditDbContext>(
            new DataAccessOptions(),
            (serviceProvider, dbContextOptionsBuilder) =>
            {
                dbContextOptionsBuilder.UseSqlServer(
                    options.ConnectionString,
                    x => x.MigrationsHistoryTable("__EFMigrationsHistory", "audit"));
            },
            (serviceProvider, dbContextOptions, areDomainEventsEnabled) => new AuditDbContext(dbContextOptions));


        services.AddScoped(typeof(IAuditEventRepository), typeof(AuditEventRepository));
        services.AddTransient(typeof(IAuditWriter<>), typeof(AuditDbWriter<>));
        services.AddTransient(typeof(IAuditBulkWriter), typeof(AuditBulkDbWriter));
        services.AddTransient(typeof(AuditDbConverter<>), typeof(AuditDbConverter<>));

        services.AddSingleton(options);
        services.AddSingleton(typeof(IAuditingInitialiser), typeof(SqlEntityAuditingInitialiser));

        return entityAuditingBuilder;
    }
}