Skip to content

Commit debe4af

Browse files
author
Bart Koelman
committed
Fixed: do not detect nested types in auto-discovery.
1 parent b46ffe9 commit debe4af

File tree

7 files changed

+94
-54
lines changed

7 files changed

+94
-54
lines changed

src/JsonApiDotNetCore/Configuration/TypeLocator.cs

+11-8
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,21 @@ public ResourceDescriptor TryGetResourceDescriptor(Type type)
8585
private static (Type implementation, Type registrationInterface)? FindGenericInterfaceImplementationForType(Type nextType, Type openGenericInterface,
8686
Type[] interfaceGenericTypeArguments)
8787
{
88-
foreach (Type nextGenericInterface in nextType.GetInterfaces().Where(type => type.IsGenericType))
88+
if (!nextType.IsNested)
8989
{
90-
Type nextOpenGenericInterface = nextGenericInterface.GetGenericTypeDefinition();
91-
92-
if (nextOpenGenericInterface == openGenericInterface)
90+
foreach (Type nextGenericInterface in nextType.GetInterfaces().Where(type => type.IsGenericType))
9391
{
94-
Type[] nextGenericArguments = nextGenericInterface.GetGenericArguments();
92+
Type nextOpenGenericInterface = nextGenericInterface.GetGenericTypeDefinition();
9593

96-
if (nextGenericArguments.Length == interfaceGenericTypeArguments.Length &&
97-
nextGenericArguments.SequenceEqual(interfaceGenericTypeArguments))
94+
if (nextOpenGenericInterface == openGenericInterface)
9895
{
99-
return (nextType, nextOpenGenericInterface.MakeGenericType(interfaceGenericTypeArguments));
96+
Type[] nextGenericArguments = nextGenericInterface.GetGenericArguments();
97+
98+
if (nextGenericArguments.Length == interfaceGenericTypeArguments.Length &&
99+
nextGenericArguments.SequenceEqual(interfaceGenericTypeArguments))
100+
{
101+
return (nextType, nextOpenGenericInterface.MakeGenericType(interfaceGenericTypeArguments));
102+
}
100103
}
101104
}
102105
}

test/DiscoveryTests/ServiceDiscoveryFacadeTests.cs

-46
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Collections.Generic;
21
using FluentAssertions;
3-
using JetBrains.Annotations;
42
using JsonApiDotNetCore.Configuration;
53
using JsonApiDotNetCore.Hooks;
64
using JsonApiDotNetCore.Middleware;
@@ -154,49 +152,5 @@ public void Can_add_resource_hooks_definition_from_current_assembly_to_container
154152
var resourceHooksDefinition = services.GetRequiredService<ResourceHooksDefinition<TestResource>>();
155153
resourceHooksDefinition.Should().BeOfType<TestResourceHooksDefinition>();
156154
}
157-
158-
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
159-
public sealed class TestResource : Identifiable
160-
{
161-
}
162-
163-
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
164-
public sealed class TestResourceService : JsonApiResourceService<TestResource>
165-
{
166-
public TestResourceService(IResourceRepositoryAccessor repositoryAccessor, IQueryLayerComposer queryLayerComposer,
167-
IPaginationContext paginationContext, IJsonApiOptions options, ILoggerFactory loggerFactory, IJsonApiRequest request,
168-
IResourceChangeTracker<TestResource> resourceChangeTracker, IResourceHookExecutorFacade hookExecutor)
169-
: base(repositoryAccessor, queryLayerComposer, paginationContext, options, loggerFactory, request, resourceChangeTracker, hookExecutor)
170-
{
171-
}
172-
}
173-
174-
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
175-
public sealed class TestResourceRepository : EntityFrameworkCoreRepository<TestResource>
176-
{
177-
public TestResourceRepository(ITargetedFields targetedFields, IDbContextResolver contextResolver, IResourceGraph resourceGraph,
178-
IResourceFactory resourceFactory, IEnumerable<IQueryConstraintProvider> constraintProviders, ILoggerFactory loggerFactory)
179-
: base(targetedFields, contextResolver, resourceGraph, resourceFactory, constraintProviders, loggerFactory)
180-
{
181-
}
182-
}
183-
184-
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
185-
public sealed class TestResourceHooksDefinition : ResourceHooksDefinition<TestResource>
186-
{
187-
public TestResourceHooksDefinition(IResourceGraph resourceGraph)
188-
: base(resourceGraph)
189-
{
190-
}
191-
}
192-
193-
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
194-
public sealed class TestResourceDefinition : JsonApiResourceDefinition<TestResource>
195-
{
196-
public TestResourceDefinition(IResourceGraph resourceGraph)
197-
: base(resourceGraph)
198-
{
199-
}
200-
}
201155
}
202156
}

test/DiscoveryTests/TestResource.cs

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Resources;
3+
4+
namespace DiscoveryTests
5+
{
6+
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
7+
public sealed class TestResource : Identifiable
8+
{
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Configuration;
3+
using JsonApiDotNetCore.Resources;
4+
5+
namespace DiscoveryTests
6+
{
7+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
8+
public sealed class TestResourceDefinition : JsonApiResourceDefinition<TestResource>
9+
{
10+
public TestResourceDefinition(IResourceGraph resourceGraph)
11+
: base(resourceGraph)
12+
{
13+
}
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Configuration;
3+
using JsonApiDotNetCore.Resources;
4+
5+
namespace DiscoveryTests
6+
{
7+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
8+
public sealed class TestResourceHooksDefinition : ResourceHooksDefinition<TestResource>
9+
{
10+
public TestResourceHooksDefinition(IResourceGraph resourceGraph)
11+
: base(resourceGraph)
12+
{
13+
}
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Collections.Generic;
2+
using JetBrains.Annotations;
3+
using JsonApiDotNetCore.Configuration;
4+
using JsonApiDotNetCore.Queries;
5+
using JsonApiDotNetCore.Repositories;
6+
using JsonApiDotNetCore.Resources;
7+
using Microsoft.Extensions.Logging;
8+
9+
namespace DiscoveryTests
10+
{
11+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
12+
public sealed class TestResourceRepository : EntityFrameworkCoreRepository<TestResource>
13+
{
14+
public TestResourceRepository(ITargetedFields targetedFields, IDbContextResolver contextResolver, IResourceGraph resourceGraph,
15+
IResourceFactory resourceFactory, IEnumerable<IQueryConstraintProvider> constraintProviders, ILoggerFactory loggerFactory)
16+
: base(targetedFields, contextResolver, resourceGraph, resourceFactory, constraintProviders, loggerFactory)
17+
{
18+
}
19+
}
20+
}
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Configuration;
3+
using JsonApiDotNetCore.Hooks;
4+
using JsonApiDotNetCore.Middleware;
5+
using JsonApiDotNetCore.Queries;
6+
using JsonApiDotNetCore.Repositories;
7+
using JsonApiDotNetCore.Resources;
8+
using JsonApiDotNetCore.Services;
9+
using Microsoft.Extensions.Logging;
10+
11+
namespace DiscoveryTests
12+
{
13+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
14+
public sealed class TestResourceService : JsonApiResourceService<TestResource>
15+
{
16+
public TestResourceService(IResourceRepositoryAccessor repositoryAccessor, IQueryLayerComposer queryLayerComposer, IPaginationContext paginationContext,
17+
IJsonApiOptions options, ILoggerFactory loggerFactory, IJsonApiRequest request, IResourceChangeTracker<TestResource> resourceChangeTracker,
18+
IResourceHookExecutorFacade hookExecutor)
19+
: base(repositoryAccessor, queryLayerComposer, paginationContext, options, loggerFactory, request, resourceChangeTracker, hookExecutor)
20+
{
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)