Skip to content

Commit 31db533

Browse files
committed
feat: add automatic QueryBuilder registration to DI
refactor: remove duplicate code fix: DI registration test: Dependency Injection methods refactor: remove unnecessary changes refactor: simplify
1 parent ffb6366 commit 31db533

File tree

3 files changed

+65
-15
lines changed

3 files changed

+65
-15
lines changed

src/Gridify/DependencyInjectionExtensions.cs

+12-15
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,28 @@ namespace Gridify;
1010
public static class DependencyInjectionExtensions
1111
{
1212
/// <summary>
13-
/// Automatically scans an assembly for classes that inherit from GridifyMapper<T> and registers them in the Dependency Injection container.
13+
/// Automatically scans an assembly for classes that inherit from GridifyMapper&lt;T&gt; and registers them in the Dependency Injection container.
1414
/// </summary>
1515
/// <param name="services">The IServiceCollection to which the mappers should be added.</param>
1616
/// <param name="assembly">The assembly to scan for GridifyMapper implementations.</param>
1717
/// <param name="lifetime">The service lifetime for the registered mappers (default is Singleton).</param>
1818
public static IServiceCollection AddGridifyMappers(this IServiceCollection services, Assembly assembly,
19-
ServiceLifetime lifetime = ServiceLifetime.Singleton)
19+
ServiceLifetime lifetime = ServiceLifetime.Singleton)
2020
{
21-
var mapperType = typeof(GridifyMapper<>);
22-
23-
var mapperTypes = assembly.GetTypes()
21+
var targetTypes = assembly.GetTypes()
2422
.Where(type =>
25-
type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true } &&
26-
type.BaseType.GetGenericTypeDefinition() == mapperType);
23+
type is { IsAbstract: false, IsGenericTypeDefinition: false, BaseType.IsGenericType: true, BaseType.Namespace: nameof(Gridify) } &&
24+
type.BaseType.GetGenericTypeDefinition() == typeof(GridifyMapper<>));
2725

28-
foreach (var mapper in mapperTypes)
26+
foreach (var type in targetTypes)
2927
{
30-
var genericArguments = mapper.BaseType?.GetGenericArguments();
31-
if (genericArguments is { Length: 1 })
32-
{
33-
var targetType = genericArguments[0];
34-
var interfaceType = typeof(IGridifyMapper<>).MakeGenericType(targetType);
35-
services.Add(new ServiceDescriptor(interfaceType, mapper, lifetime));
36-
}
28+
var genericArguments = type.BaseType?.GetGenericArguments();
29+
if (genericArguments is not { Length: 1 }) continue;
30+
var targetType = genericArguments[0];
31+
var interfaceType = typeof(IGridifyMapper<>).MakeGenericType(targetType);
32+
services.Add(new ServiceDescriptor(interfaceType, type, lifetime));
3733
}
34+
3835
return services;
3936
}
4037
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Reflection;
2+
using FluentAssertions;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using NSubstitute;
5+
using Xunit;
6+
7+
namespace Gridify.Tests;
8+
9+
public class DependencyInjectionTests
10+
{
11+
12+
[Fact]
13+
public void AddGridifyMappers_ShouldRegisterMappers()
14+
{
15+
// Arrange
16+
var services = new ServiceCollection();
17+
var assemblyMock = GetAssembly();
18+
19+
// Act
20+
services.AddGridifyMappers(assemblyMock);
21+
22+
// Assert
23+
var serviceProvider = services.BuildServiceProvider();
24+
serviceProvider.GetService<IGridifyMapper<TestEntity>>().Should().NotBeNull();
25+
serviceProvider.GetService<IGridifyMapper<TestEntity2>>().Should().NotBeNull();
26+
serviceProvider.GetService<TestMapper>().Should().BeNull();
27+
services.Count.Should().Be(2);
28+
}
29+
30+
private static Assembly GetAssembly()
31+
{
32+
var assemblyMock = Substitute.For<Assembly>();
33+
assemblyMock.GetTypes().Returns([
34+
typeof(TestMapper),
35+
typeof(AnotherTestMapper),
36+
typeof(NonGridifyMapper),
37+
]);
38+
return assemblyMock;
39+
}
40+
public record TestEntity(string P1, string P2);
41+
42+
public record TestEntity2(string P1, string P2);
43+
44+
public class TestMapper : GridifyMapper<TestEntity>;
45+
46+
public class AnotherTestMapper : GridifyMapper<TestEntity2>;
47+
48+
49+
// Non-Gridify types for testing
50+
public class NonGridifyMapper;
51+
}

test/Gridify.Tests/Gridify.Tests.csproj

+2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
<ItemGroup>
1111
<PackageReference Include="AutoBogus" Version="2.13.1" />
1212
<PackageReference Include="FluentAssertions" Version="6.0.0" />
13+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
1314
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
15+
<PackageReference Include="NSubstitute" Version="5.1.0" />
1416
<PackageReference Include="xunit" Version="2.6.1" />
1517
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3">
1618
<PrivateAssets>all</PrivateAssets>

0 commit comments

Comments
 (0)