From b79384541813892a52ed2a328ab553d5c9faee0d Mon Sep 17 00:00:00 2001 From: AliReZa Sabouri Date: Sat, 29 Jun 2024 16:35:55 +0200 Subject: [PATCH 1/6] feat: add automatic QueryBuilder registration to DI --- src/Gridify/DependencyInjectionExtensions.cs | 78 +++++++++++++++++--- 1 file changed, 66 insertions(+), 12 deletions(-) diff --git a/src/Gridify/DependencyInjectionExtensions.cs b/src/Gridify/DependencyInjectionExtensions.cs index 20d597de..9ab43be3 100644 --- a/src/Gridify/DependencyInjectionExtensions.cs +++ b/src/Gridify/DependencyInjectionExtensions.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; @@ -9,32 +10,85 @@ namespace Gridify; /// public static class DependencyInjectionExtensions { + private static readonly Type GridifyMapperType = typeof(GridifyMapper<>); + private static readonly Type QueryBuilderType = typeof(QueryBuilder<>); + /// - /// Automatically scans an assembly for classes that inherit from GridifyMapper and registers them in the Dependency Injection container. + /// Automatically scans an assembly for classes that inherit from GridifyMapper<T> and registers them in the Dependency Injection container. /// /// The IServiceCollection to which the mappers should be added. /// The assembly to scan for GridifyMapper implementations. /// The service lifetime for the registered mappers (default is Singleton). public static IServiceCollection AddGridifyMappers(this IServiceCollection services, Assembly assembly, + ServiceLifetime lifetime = ServiceLifetime.Singleton) + { + var mapperTypes = assembly.GetTypes() + .Where(type => + type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && + type.BaseType.GetGenericTypeDefinition() == GridifyMapperType); + + foreach (var mapper in mapperTypes) + { + var genericArguments = mapper.BaseType?.GetGenericArguments(); + if (genericArguments is not { Length: 1 }) continue; + var targetType = genericArguments[0]; + var interfaceType = GridifyMapperType.MakeGenericType(targetType); + services.Add(new ServiceDescriptor(interfaceType, mapper, lifetime)); + } + + return services; + } + + /// + /// Automatically scans an assembly for classes that inherit from QueryBuilder<T> and registers them in the Dependency Injection container. + /// + /// The IServiceCollection to which the query builders should be added. + /// The assembly to scan for QueryBuilder implementations. + /// The service lifetime for the registered query builders (default is Singleton). + public static IServiceCollection AddGridifyQueryBuilders(this IServiceCollection services, Assembly assembly, ServiceLifetime lifetime = ServiceLifetime.Singleton) { - var mapperType = typeof(GridifyMapper<>); + var queryBuilderTypes = assembly.GetTypes() + .Where(type => + type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && + type.BaseType.GetGenericTypeDefinition() == QueryBuilderType); - var mapperTypes = assembly.GetTypes() + foreach (var queryBuilder in queryBuilderTypes) + { + var genericArguments = queryBuilder.BaseType?.GetGenericArguments(); + if (genericArguments is not { Length: 1 }) continue; + var targetType = genericArguments[0]; + var interfaceType = QueryBuilderType.MakeGenericType(targetType); + services.Add(new ServiceDescriptor(interfaceType, queryBuilder, lifetime)); + } + + return services; + } + + /// + /// Automatically scans an assembly for classes that inherit from either GridifyMapper<T> or QueryBuilder<T> + /// and registers them in the Dependency Injection container. + /// + /// The IServiceCollection to which the mappers and query builders should be added. + /// The assembly to scan for GridifyMapper and QueryBuilder implementations. + /// The service lifetime for the registered types (default is Singleton). + public static IServiceCollection AddGridify(this IServiceCollection services, Assembly assembly, + ServiceLifetime lifetime = ServiceLifetime.Singleton) + { + var types = assembly.GetTypes() .Where(type => type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && - type.BaseType.GetGenericTypeDefinition() == mapperType); + (type.BaseType.GetGenericTypeDefinition() == QueryBuilderType || type.BaseType.GetGenericTypeDefinition() == GridifyMapperType)); - foreach (var mapper in mapperTypes) + foreach (var type in types) { - var genericArguments = mapper.BaseType?.GetGenericArguments(); - if (genericArguments is { Length: 1 }) - { - var targetType = genericArguments[0]; -var interfaceType = typeof(IGridifyMapper<>).MakeGenericType(targetType); -services.Add(new ServiceDescriptor(interfaceType, mapper, lifetime)); - } + var genericArguments = type.BaseType?.GetGenericArguments(); + if (genericArguments is not { Length: 1 }) continue; + var targetType = genericArguments[0]; + var interfaceType = type.MakeGenericType(targetType); + services.Add(new ServiceDescriptor(interfaceType, interfaceType, lifetime)); } + return services; } } From 988c6831747face741ecb3fd4ee0425532aa95c5 Mon Sep 17 00:00:00 2001 From: AliReZa Sabouri Date: Sat, 29 Jun 2024 17:53:52 +0200 Subject: [PATCH 2/6] refactor: remove duplicate code --- src/Gridify/DependencyInjectionExtensions.cs | 51 +++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/src/Gridify/DependencyInjectionExtensions.cs b/src/Gridify/DependencyInjectionExtensions.cs index 9ab43be3..2e8d79f1 100644 --- a/src/Gridify/DependencyInjectionExtensions.cs +++ b/src/Gridify/DependencyInjectionExtensions.cs @@ -22,20 +22,7 @@ public static class DependencyInjectionExtensions public static IServiceCollection AddGridifyMappers(this IServiceCollection services, Assembly assembly, ServiceLifetime lifetime = ServiceLifetime.Singleton) { - var mapperTypes = assembly.GetTypes() - .Where(type => - type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && - type.BaseType.GetGenericTypeDefinition() == GridifyMapperType); - - foreach (var mapper in mapperTypes) - { - var genericArguments = mapper.BaseType?.GetGenericArguments(); - if (genericArguments is not { Length: 1 }) continue; - var targetType = genericArguments[0]; - var interfaceType = GridifyMapperType.MakeGenericType(targetType); - services.Add(new ServiceDescriptor(interfaceType, mapper, lifetime)); - } - + ScanAndAddByType(services, assembly, lifetime, GridifyMapperType); return services; } @@ -48,20 +35,7 @@ public static IServiceCollection AddGridifyMappers(this IServiceCollection servi public static IServiceCollection AddGridifyQueryBuilders(this IServiceCollection services, Assembly assembly, ServiceLifetime lifetime = ServiceLifetime.Singleton) { - var queryBuilderTypes = assembly.GetTypes() - .Where(type => - type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && - type.BaseType.GetGenericTypeDefinition() == QueryBuilderType); - - foreach (var queryBuilder in queryBuilderTypes) - { - var genericArguments = queryBuilder.BaseType?.GetGenericArguments(); - if (genericArguments is not { Length: 1 }) continue; - var targetType = genericArguments[0]; - var interfaceType = QueryBuilderType.MakeGenericType(targetType); - services.Add(new ServiceDescriptor(interfaceType, queryBuilder, lifetime)); - } - + ScanAndAddByType(services, assembly, lifetime, QueryBuilderType); return services; } @@ -85,10 +59,29 @@ public static IServiceCollection AddGridify(this IServiceCollection services, As var genericArguments = type.BaseType?.GetGenericArguments(); if (genericArguments is not { Length: 1 }) continue; var targetType = genericArguments[0]; - var interfaceType = type.MakeGenericType(targetType); + var interfaceType = type.BaseType == GridifyMapperType + ? GridifyMapperType.MakeGenericType(targetType) + : QueryBuilderType.MakeGenericType(targetType); services.Add(new ServiceDescriptor(interfaceType, interfaceType, lifetime)); } return services; } + + private static void ScanAndAddByType(IServiceCollection services, Assembly assembly, ServiceLifetime lifetime, Type scanType) + { + var mapperTypes = assembly.GetTypes() + .Where(type => + type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && + type.BaseType.GetGenericTypeDefinition() == scanType); + + foreach (var mapper in mapperTypes) + { + var genericArguments = mapper.BaseType?.GetGenericArguments(); + if (genericArguments is not { Length: 1 }) continue; + var targetType = genericArguments[0]; + var interfaceType = scanType.MakeGenericType(targetType); + services.Add(new ServiceDescriptor(interfaceType, mapper, lifetime)); + } + } } From e28d57f468b01189adc709128d19814cc9806647 Mon Sep 17 00:00:00 2001 From: AliReZa Sabouri Date: Sat, 29 Jun 2024 18:57:25 +0200 Subject: [PATCH 3/6] fix: DI registration --- src/Gridify/DependencyInjectionExtensions.cs | 46 ++++++++++---------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/Gridify/DependencyInjectionExtensions.cs b/src/Gridify/DependencyInjectionExtensions.cs index 2e8d79f1..b47c80f4 100644 --- a/src/Gridify/DependencyInjectionExtensions.cs +++ b/src/Gridify/DependencyInjectionExtensions.cs @@ -10,8 +10,8 @@ namespace Gridify; /// public static class DependencyInjectionExtensions { - private static readonly Type GridifyMapperType = typeof(GridifyMapper<>); - private static readonly Type QueryBuilderType = typeof(QueryBuilder<>); + private static readonly (Type BaseType, Type Interface) GridifyMapperType = (typeof(GridifyMapper<>), typeof(IGridifyMapper<>)); + private static readonly (Type BaseType, Type Interface) QueryBuilderType = (typeof(QueryBuilder<>), typeof(IQueryBuilder<>)); /// /// Automatically scans an assembly for classes that inherit from GridifyMapper<T> and registers them in the Dependency Injection container. @@ -22,8 +22,7 @@ public static class DependencyInjectionExtensions public static IServiceCollection AddGridifyMappers(this IServiceCollection services, Assembly assembly, ServiceLifetime lifetime = ServiceLifetime.Singleton) { - ScanAndAddByType(services, assembly, lifetime, GridifyMapperType); - return services; + return ScanAndAddByType(services, assembly, lifetime, GridifyMapperType); } /// @@ -35,8 +34,7 @@ public static IServiceCollection AddGridifyMappers(this IServiceCollection servi public static IServiceCollection AddGridifyQueryBuilders(this IServiceCollection services, Assembly assembly, ServiceLifetime lifetime = ServiceLifetime.Singleton) { - ScanAndAddByType(services, assembly, lifetime, QueryBuilderType); - return services; + return ScanAndAddByType(services, assembly, lifetime, QueryBuilderType); } /// @@ -50,38 +48,42 @@ public static IServiceCollection AddGridify(this IServiceCollection services, As ServiceLifetime lifetime = ServiceLifetime.Singleton) { var types = assembly.GetTypes() - .Where(type => - type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && - (type.BaseType.GetGenericTypeDefinition() == QueryBuilderType || type.BaseType.GetGenericTypeDefinition() == GridifyMapperType)); + .Where(type => type is + { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true, BaseType.Namespace: nameof(Gridify) }) + .Select(type => (type, typeDefinition: type.BaseType?.GetGenericTypeDefinition())) + .Where(q => q.typeDefinition != null && q.typeDefinition == QueryBuilderType.BaseType || q.typeDefinition == GridifyMapperType.BaseType); - foreach (var type in types) + foreach (var (type, typeDefinition) in types) { var genericArguments = type.BaseType?.GetGenericArguments(); if (genericArguments is not { Length: 1 }) continue; var targetType = genericArguments[0]; - var interfaceType = type.BaseType == GridifyMapperType - ? GridifyMapperType.MakeGenericType(targetType) - : QueryBuilderType.MakeGenericType(targetType); - services.Add(new ServiceDescriptor(interfaceType, interfaceType, lifetime)); + var interfaceType = typeDefinition == GridifyMapperType.BaseType + ? GridifyMapperType.Interface.MakeGenericType(targetType) + : QueryBuilderType.Interface.MakeGenericType(targetType); + services.Add(new ServiceDescriptor(interfaceType, type, lifetime)); } return services; } - private static void ScanAndAddByType(IServiceCollection services, Assembly assembly, ServiceLifetime lifetime, Type scanType) + private static IServiceCollection ScanAndAddByType(IServiceCollection services, Assembly assembly, ServiceLifetime lifetime, + (Type BaseType, Type Interface) scanType) { - var mapperTypes = assembly.GetTypes() + var targetTypes = assembly.GetTypes() .Where(type => - type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } && - type.BaseType.GetGenericTypeDefinition() == scanType); + type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true, BaseType.Namespace: nameof(Gridify) } && + type.BaseType.GetGenericTypeDefinition() == scanType.BaseType); - foreach (var mapper in mapperTypes) + foreach (var type in targetTypes) { - var genericArguments = mapper.BaseType?.GetGenericArguments(); + var genericArguments = type.BaseType?.GetGenericArguments(); if (genericArguments is not { Length: 1 }) continue; var targetType = genericArguments[0]; - var interfaceType = scanType.MakeGenericType(targetType); - services.Add(new ServiceDescriptor(interfaceType, mapper, lifetime)); + var interfaceType = scanType.Interface.MakeGenericType(targetType); + services.Add(new ServiceDescriptor(interfaceType, type, lifetime)); } + + return services; } } From c841efb2a0535a4e6f83b94193f95586289a15a1 Mon Sep 17 00:00:00 2001 From: AliReZa Sabouri Date: Sat, 29 Jun 2024 18:57:48 +0200 Subject: [PATCH 4/6] test: Dependency Injection methods --- .../Gridify.Tests/DependencyInjectionTests.cs | 94 +++++++++++++++++++ test/Gridify.Tests/Gridify.Tests.csproj | 2 + 2 files changed, 96 insertions(+) create mode 100644 test/Gridify.Tests/DependencyInjectionTests.cs diff --git a/test/Gridify.Tests/DependencyInjectionTests.cs b/test/Gridify.Tests/DependencyInjectionTests.cs new file mode 100644 index 00000000..dc199302 --- /dev/null +++ b/test/Gridify.Tests/DependencyInjectionTests.cs @@ -0,0 +1,94 @@ +using System.Reflection; +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Xunit; + +namespace Gridify.Tests; + +public class DependencyInjectionTests +{ + + [Fact] + public void AddGridifyMappers_ShouldRegisterMappers() + { + // Arrange + var services = new ServiceCollection(); + var assemblyMock = GetAssembly(); + + // Act + services.AddGridifyMappers(assemblyMock); + + // Assert + var serviceProvider = services.BuildServiceProvider(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService().Should().BeNull(); + services.Count.Should().Be(2); + } + + [Fact] + public void AddGridifyQueryBuilders_ShouldRegisterQueryBuilders() + { + // Arrange + var services = new ServiceCollection(); + var assemblyMock = GetAssembly(); + + // Act + services.AddGridifyQueryBuilders(assemblyMock); + + // Assert + var serviceProvider = services.BuildServiceProvider(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService().Should().BeNull(); + services.Count.Should().Be(2); + } + + [Fact] + public void AddGridify_ShouldRegisterBothMappersAndQueryBuilders() + { + // Arrange + var services = new ServiceCollection(); + var assemblyMock = GetAssembly(); + + // Act + services.AddGridify(assemblyMock); + + // Assert + var serviceProvider = services.BuildServiceProvider(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService().Should().BeNull(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService>().Should().NotBeNull(); + serviceProvider.GetService().Should().BeNull(); + services.Count.Should().Be(4); + } + private static Assembly GetAssembly() + { + var assemblyMock = Substitute.For(); + assemblyMock.GetTypes().Returns([ + typeof(TestMapper), + typeof(AnotherTestMapper), + typeof(NonGridifyMapper), + typeof(TestQueryBuilder), + typeof(AnotherTestQueryBuilder) + ]); + return assemblyMock; + } + public record TestEntity(string P1, string P2); + + public record TestEntity2(string P1, string P2); + + public class TestMapper : GridifyMapper; + + public class AnotherTestMapper : GridifyMapper; + + public class TestQueryBuilder : QueryBuilder; + + public class AnotherTestQueryBuilder : QueryBuilder; + + // Non-Gridify types for testing + public class NonGridifyMapper; +} diff --git a/test/Gridify.Tests/Gridify.Tests.csproj b/test/Gridify.Tests/Gridify.Tests.csproj index 71b9e6da..725a2a52 100644 --- a/test/Gridify.Tests/Gridify.Tests.csproj +++ b/test/Gridify.Tests/Gridify.Tests.csproj @@ -10,7 +10,9 @@ + + all From e4754b129b6b7489822723cd45707ab66c5f0ad6 Mon Sep 17 00:00:00 2001 From: AliReZa Sabouri Date: Sat, 29 Jun 2024 20:43:12 +0200 Subject: [PATCH 5/6] refactor: remove unnecessary changes --- src/Gridify/DependencyInjectionExtensions.cs | 53 +------------------ .../Gridify.Tests/DependencyInjectionTests.cs | 43 --------------- 2 files changed, 2 insertions(+), 94 deletions(-) diff --git a/src/Gridify/DependencyInjectionExtensions.cs b/src/Gridify/DependencyInjectionExtensions.cs index b47c80f4..98e84aae 100644 --- a/src/Gridify/DependencyInjectionExtensions.cs +++ b/src/Gridify/DependencyInjectionExtensions.cs @@ -11,7 +11,6 @@ namespace Gridify; public static class DependencyInjectionExtensions { private static readonly (Type BaseType, Type Interface) GridifyMapperType = (typeof(GridifyMapper<>), typeof(IGridifyMapper<>)); - private static readonly (Type BaseType, Type Interface) QueryBuilderType = (typeof(QueryBuilder<>), typeof(IQueryBuilder<>)); /// /// Automatically scans an assembly for classes that inherit from GridifyMapper<T> and registers them in the Dependency Injection container. @@ -21,66 +20,18 @@ public static class DependencyInjectionExtensions /// The service lifetime for the registered mappers (default is Singleton). public static IServiceCollection AddGridifyMappers(this IServiceCollection services, Assembly assembly, ServiceLifetime lifetime = ServiceLifetime.Singleton) - { - return ScanAndAddByType(services, assembly, lifetime, GridifyMapperType); - } - - /// - /// Automatically scans an assembly for classes that inherit from QueryBuilder<T> and registers them in the Dependency Injection container. - /// - /// The IServiceCollection to which the query builders should be added. - /// The assembly to scan for QueryBuilder implementations. - /// The service lifetime for the registered query builders (default is Singleton). - public static IServiceCollection AddGridifyQueryBuilders(this IServiceCollection services, Assembly assembly, - ServiceLifetime lifetime = ServiceLifetime.Singleton) - { - return ScanAndAddByType(services, assembly, lifetime, QueryBuilderType); - } - - /// - /// Automatically scans an assembly for classes that inherit from either GridifyMapper<T> or QueryBuilder<T> - /// and registers them in the Dependency Injection container. - /// - /// The IServiceCollection to which the mappers and query builders should be added. - /// The assembly to scan for GridifyMapper and QueryBuilder implementations. - /// The service lifetime for the registered types (default is Singleton). - public static IServiceCollection AddGridify(this IServiceCollection services, Assembly assembly, - ServiceLifetime lifetime = ServiceLifetime.Singleton) - { - var types = assembly.GetTypes() - .Where(type => type is - { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true, BaseType.Namespace: nameof(Gridify) }) - .Select(type => (type, typeDefinition: type.BaseType?.GetGenericTypeDefinition())) - .Where(q => q.typeDefinition != null && q.typeDefinition == QueryBuilderType.BaseType || q.typeDefinition == GridifyMapperType.BaseType); - - foreach (var (type, typeDefinition) in types) - { - var genericArguments = type.BaseType?.GetGenericArguments(); - if (genericArguments is not { Length: 1 }) continue; - var targetType = genericArguments[0]; - var interfaceType = typeDefinition == GridifyMapperType.BaseType - ? GridifyMapperType.Interface.MakeGenericType(targetType) - : QueryBuilderType.Interface.MakeGenericType(targetType); - services.Add(new ServiceDescriptor(interfaceType, type, lifetime)); - } - - return services; - } - - private static IServiceCollection ScanAndAddByType(IServiceCollection services, Assembly assembly, ServiceLifetime lifetime, - (Type BaseType, Type Interface) scanType) { var targetTypes = assembly.GetTypes() .Where(type => type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true, BaseType.Namespace: nameof(Gridify) } && - type.BaseType.GetGenericTypeDefinition() == scanType.BaseType); + type.BaseType.GetGenericTypeDefinition() == GridifyMapperType.BaseType); foreach (var type in targetTypes) { var genericArguments = type.BaseType?.GetGenericArguments(); if (genericArguments is not { Length: 1 }) continue; var targetType = genericArguments[0]; - var interfaceType = scanType.Interface.MakeGenericType(targetType); + var interfaceType = GridifyMapperType.Interface.MakeGenericType(targetType); services.Add(new ServiceDescriptor(interfaceType, type, lifetime)); } diff --git a/test/Gridify.Tests/DependencyInjectionTests.cs b/test/Gridify.Tests/DependencyInjectionTests.cs index dc199302..15e408a9 100644 --- a/test/Gridify.Tests/DependencyInjectionTests.cs +++ b/test/Gridify.Tests/DependencyInjectionTests.cs @@ -27,44 +27,6 @@ public void AddGridifyMappers_ShouldRegisterMappers() services.Count.Should().Be(2); } - [Fact] - public void AddGridifyQueryBuilders_ShouldRegisterQueryBuilders() - { - // Arrange - var services = new ServiceCollection(); - var assemblyMock = GetAssembly(); - - // Act - services.AddGridifyQueryBuilders(assemblyMock); - - // Assert - var serviceProvider = services.BuildServiceProvider(); - serviceProvider.GetService>().Should().NotBeNull(); - serviceProvider.GetService>().Should().NotBeNull(); - serviceProvider.GetService().Should().BeNull(); - services.Count.Should().Be(2); - } - - [Fact] - public void AddGridify_ShouldRegisterBothMappersAndQueryBuilders() - { - // Arrange - var services = new ServiceCollection(); - var assemblyMock = GetAssembly(); - - // Act - services.AddGridify(assemblyMock); - - // Assert - var serviceProvider = services.BuildServiceProvider(); - serviceProvider.GetService>().Should().NotBeNull(); - serviceProvider.GetService>().Should().NotBeNull(); - serviceProvider.GetService().Should().BeNull(); - serviceProvider.GetService>().Should().NotBeNull(); - serviceProvider.GetService>().Should().NotBeNull(); - serviceProvider.GetService().Should().BeNull(); - services.Count.Should().Be(4); - } private static Assembly GetAssembly() { var assemblyMock = Substitute.For(); @@ -72,8 +34,6 @@ private static Assembly GetAssembly() typeof(TestMapper), typeof(AnotherTestMapper), typeof(NonGridifyMapper), - typeof(TestQueryBuilder), - typeof(AnotherTestQueryBuilder) ]); return assemblyMock; } @@ -85,9 +45,6 @@ public class TestMapper : GridifyMapper; public class AnotherTestMapper : GridifyMapper; - public class TestQueryBuilder : QueryBuilder; - - public class AnotherTestQueryBuilder : QueryBuilder; // Non-Gridify types for testing public class NonGridifyMapper; From 6f4ff97538a8a65ad53912f237392a56bb240c88 Mon Sep 17 00:00:00 2001 From: AliReZa Sabouri Date: Sat, 29 Jun 2024 20:45:32 +0200 Subject: [PATCH 6/6] refactor: simplify --- src/Gridify/DependencyInjectionExtensions.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Gridify/DependencyInjectionExtensions.cs b/src/Gridify/DependencyInjectionExtensions.cs index 98e84aae..44d3046c 100644 --- a/src/Gridify/DependencyInjectionExtensions.cs +++ b/src/Gridify/DependencyInjectionExtensions.cs @@ -1,4 +1,3 @@ -using System; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; @@ -10,8 +9,6 @@ namespace Gridify; /// public static class DependencyInjectionExtensions { - private static readonly (Type BaseType, Type Interface) GridifyMapperType = (typeof(GridifyMapper<>), typeof(IGridifyMapper<>)); - /// /// Automatically scans an assembly for classes that inherit from GridifyMapper<T> and registers them in the Dependency Injection container. /// @@ -24,14 +21,14 @@ public static IServiceCollection AddGridifyMappers(this IServiceCollection servi var targetTypes = assembly.GetTypes() .Where(type => type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true, BaseType.Namespace: nameof(Gridify) } && - type.BaseType.GetGenericTypeDefinition() == GridifyMapperType.BaseType); + type.BaseType.GetGenericTypeDefinition() == typeof(GridifyMapper<>)); foreach (var type in targetTypes) { var genericArguments = type.BaseType?.GetGenericArguments(); if (genericArguments is not { Length: 1 }) continue; var targetType = genericArguments[0]; - var interfaceType = GridifyMapperType.Interface.MakeGenericType(targetType); + var interfaceType = typeof(IGridifyMapper<>).MakeGenericType(targetType); services.Add(new ServiceDescriptor(interfaceType, type, lifetime)); }