From 1e3cba6fdf2ebcc7d6cf1d895f88bbc5f2ba70de Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 19 Dec 2025 10:09:04 +0100 Subject: [PATCH] Refactor DependencyInjection and RepositoryConfiguration classes Restructure code for improved readability and maintainability. Move RepositoryConfiguration as a nested public class inside DependencyInjection, group related service registration logic, and clarify method organization. No functional changes. --- .../DependencyInjection.cs | 200 +++++++++--------- 1 file changed, 96 insertions(+), 104 deletions(-) diff --git a/DigitalData.Core.Infrastructure/DependencyInjection.cs b/DigitalData.Core.Infrastructure/DependencyInjection.cs index 2260b73..8e65079 100644 --- a/DigitalData.Core.Infrastructure/DependencyInjection.cs +++ b/DigitalData.Core.Infrastructure/DependencyInjection.cs @@ -11,142 +11,134 @@ using System.Linq; #endif namespace DigitalData.Core.Infrastructure -#if NET - ; -#elif NETFRAMEWORK - { -#endif - -public static class DependencyInjection { - public static IServiceCollection AddDbRepository(this IServiceCollection services, Action options) - { - // register services from configuration - var cfg = new RepositoryConfiguration(); - options.Invoke(cfg); - cfg.RegisterAllServices(services); - - return services; - } - - public class RepositoryConfiguration + public static class DependencyInjection { - // 1. register from assembly - private readonly Queue> RegsFromAssembly = new Queue>(); - - // 2. register entities (can overwrite) - private readonly Queue> RegsEntity = new Queue>(); + public static IServiceCollection AddDbRepository(this IServiceCollection services, Action options) + { + // register services from configuration + var cfg = new RepositoryConfiguration(); + options.Invoke(cfg); + cfg.RegisterAllServices(services); - // 3. register db set factories (can overwrite) - private readonly Queue> RegsDbSetFactory = new Queue>(); + return services; + } - // 4. register repository - private readonly Queue> RegsRepository = new Queue>(); - - internal void RegisterAllServices(IServiceCollection services) + public class RepositoryConfiguration { // 1. register from assembly - RegsFromAssembly.InvokeAll(services); + private readonly Queue> RegsFromAssembly = new Queue>(); // 2. register entities (can overwrite) - RegsEntity.InvokeAll(services); + private readonly Queue> RegsEntity = new Queue>(); // 3. register db set factories (can overwrite) - RegsDbSetFactory.InvokeAll(services); - } + private readonly Queue> RegsDbSetFactory = new Queue>(); - internal RepositoryConfiguration() { } + // 4. register repository + private readonly Queue> RegsRepository = new Queue>(); - public void RegisterFromAssembly(Assembly assembly) where TDbContext : DbContext - { - void reg(IServiceCollection services) + internal void RegisterAllServices(IServiceCollection services) { - // scan all types in the Assembly - var entityTypes = assembly.GetTypes() - .Where(t => t.IsClass && !t.IsAbstract && t.GetCustomAttribute() != null); + // 1. register from assembly + RegsFromAssembly.InvokeAll(services); + + // 2. register entities (can overwrite) + RegsEntity.InvokeAll(services); + + // 3. register db set factories (can overwrite) + RegsDbSetFactory.InvokeAll(services); + } + + internal RepositoryConfiguration() { } - foreach (var entityType in entityTypes) + public void RegisterFromAssembly(Assembly assembly) where TDbContext : DbContext + { + void reg(IServiceCollection services) { - #region Repository - /// register repository - // create generic DbRepository type - var repositoryType = typeof(DbRepository<,>).MakeGenericType(typeof(TDbContext), entityType); - var interfaceType = typeof(IRepository<>).MakeGenericType(entityType); - - // add into DI container as Scoped - services.AddScoped(interfaceType, repositoryType); - #endregion Repository - - #region DbSetFactory - /// register DbSetFactory - var addDbSetFactoryMethod = typeof(DependencyInjection) - .GetMethod(nameof(AddDbSetFactory), - BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); - - var genericMethod = addDbSetFactoryMethod + // scan all types in the Assembly + var entityTypes = assembly.GetTypes() + .Where(t => t.IsClass && !t.IsAbstract && t.GetCustomAttribute() != null); + + foreach (var entityType in entityTypes) + { + #region Repository + /// register repository + // create generic DbRepository type + var repositoryType = typeof(DbRepository<,>).MakeGenericType(typeof(TDbContext), entityType); + var interfaceType = typeof(IRepository<>).MakeGenericType(entityType); + + // add into DI container as Scoped + services.AddScoped(interfaceType, repositoryType); + #endregion Repository + + #region DbSetFactory + /// register DbSetFactory + var addDbSetFactoryMethod = typeof(DependencyInjection) + .GetMethod(nameof(AddDbSetFactory), + BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); + + var genericMethod = addDbSetFactoryMethod #if NET ! #endif - .MakeGenericMethod(typeof(TDbContext), entityType); - genericMethod.Invoke(null, new [] { services, null }); - #endregion DbSetFactory + .MakeGenericMethod(typeof(TDbContext), entityType); + genericMethod.Invoke(null, new [] { services, null }); + #endregion DbSetFactory + } } - } - RegsFromAssembly.Enqueue(reg); - } + RegsFromAssembly.Enqueue(reg); + } - public void RegisterEntity(Func> + public void RegisterEntity(Func> #if NET ? #endif - dbSetFactory = null) - where TDbContext : DbContext - where TEntity : class - { - void reg(IServiceCollection services) - => services - .AddScoped, DbRepository>() - .AddDbSetFactory(dbSetFactory); + dbSetFactory = null) + where TDbContext : DbContext + where TEntity : class + { + void reg(IServiceCollection services) + => services + .AddScoped, DbRepository>() + .AddDbSetFactory(dbSetFactory); + + RegsEntity.Enqueue(reg); + } + + public void RegisterDbSetFactory(Func> dbSetFactory) + where TDbContext : DbContext + where TEntity : class + => RegsDbSetFactory.Enqueue(s => s.AddDbSetFactory(dbSetFactory)); - RegsEntity.Enqueue(reg); + public void RegisterDefaultRepository() + where TDbContext : DbContext + => RegsRepository.Enqueue(s => s.AddScoped>()); } - public void RegisterDbSetFactory(Func> dbSetFactory) - where TDbContext : DbContext - where TEntity : class - => RegsDbSetFactory.Enqueue(s => s.AddDbSetFactory(dbSetFactory)); - - public void RegisterDefaultRepository() - where TDbContext : DbContext - => RegsRepository.Enqueue(s => s.AddScoped>()); - } - - private static void InvokeAll(this Queue> queue, T services) - { - while (queue.Count > 0) - queue.Dequeue().Invoke(services); - } + private static void InvokeAll(this Queue> queue, T services) + { + while (queue.Count > 0) + queue.Dequeue().Invoke(services); + } - internal static IServiceCollection AddDbSetFactory(this IServiceCollection services, Func> + internal static IServiceCollection AddDbSetFactory(this IServiceCollection services, Func> #if NET ? #endif - create = null) - where TDbContext : DbContext - where TEntity : class - { + create = null) + where TDbContext : DbContext + where TEntity : class + { #if NET - create ??= ctx => ctx.Set(); + create ??= ctx => ctx.Set(); #elif NETFRAMEWORK - if(create is null) - create = ctx => ctx.Set(); + if(create is null) + create = ctx => ctx.Set(); #endif - services.AddSingleton(_ => new DbSetFactory(create)); - return services; - } -} - -#if NETFRAMEWORK + services.AddSingleton(_ => new DbSetFactory(create)); + return services; + } } -#endif \ No newline at end of file +} \ No newline at end of file