onebeyond/onebeyond-studio-core

View on GitHub
src/OneBeyond.Studio.DataAccess.EFCore/DependencyInjection/ServiceCollectionExtensions.cs

Summary

Maintainability
A
1 hr
Test Coverage
using System;
using System.Reflection;
using EnsureThat;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using OneBeyond.Studio.Application.SharedKernel.DomainEvents;
using OneBeyond.Studio.DataAccess.EFCore.DomainEvents;
using OneBeyond.Studio.DataAccess.EFCore.Options;
using OneBeyond.Studio.DataAccess.EFCore.Projections;

namespace OneBeyond.Studio.DataAccess.EFCore.DependencyInjection;

public static class ServiceCollectionExtensions
{
    public static IDataAccessBuilder AddDataAccess<TDbContext>(
        this IServiceCollection services,
        DataAccessOptions options,
        Action<IServiceProvider, DbContextOptionsBuilder<TDbContext>> configureDbContext,
        Func<IServiceProvider, DbContextOptions<TDbContext>, bool, TDbContext> createDbContext)
        where TDbContext : DbContext
        => new DataAccessBuilder<TDbContext>(
            services,
            options,
            configureDbContext,
            createDbContext);

    public static IServiceCollection AddDbContextRaisedDomainEventReceiver<TDbContext>(
        this IServiceCollection services)
        where TDbContext : DbContext
    {
        EnsureArg.IsNotNull(services, nameof(services));

        services.AddTransient<IRaisedDomainEventReceiver, DbContextRaisedDomainEventReceiver<TDbContext>>();

        return services;
    }

    public static IServiceCollection AddMsSQLRaisedDomainEventReceiver<TDbContext>(
        this IServiceCollection services)
        where TDbContext : DbContext
    {
        EnsureArg.IsNotNull(services, nameof(services));

        services.AddTransient<IRaisedDomainEventReceiver, MsSQLRaisedDomainEventReceiver<TDbContext>>();

        return services;
    }

    public static IServiceCollection AddPostgreSQLRaisedDomainEventReceiver<TDbContext>(
        this IServiceCollection services)
        where TDbContext : DbContext
    {
        EnsureArg.IsNotNull(services, nameof(services));

        services.AddTransient<IRaisedDomainEventReceiver, PostgreSQLRaisedDomainEventReceiver<TDbContext>>();

        return services;
    }

    public static IServiceCollection AddEntityTypeProjections(
        this IServiceCollection services,
        params Assembly[] entityTypeProjectionsAssemblies)
    {
        EnsureArg.IsNotNull(services, nameof(services));

        services.Scan((scan) =>
            scan.FromAssemblies(entityTypeProjectionsAssemblies)
                .AddClasses((classes) => classes.AssignableTo(typeof(IEntityTypeProjection<>)))
                    .AsImplementedInterfaces()
                    .WithSingletonLifetime());

        return services;
    }
}