Skip to content

Commit 6be4bae

Browse files
author
Bart Koelman
authored
Fixes auto-discovery when resources, DbContexts and injectables are spread over different assemblies (#997)
1 parent d033166 commit 6be4bae

File tree

3 files changed

+22
-16
lines changed

3 files changed

+22
-16
lines changed

src/JsonApiDotNetCore/Configuration/ResourceDescriptorAssemblyCache.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,18 @@ public void RegisterAssembly(Assembly assembly)
2323
}
2424
}
2525

26-
public IEnumerable<(Assembly assembly, IReadOnlyCollection<ResourceDescriptor> resourceDescriptors)> GetResourceDescriptorsPerAssembly()
26+
public IReadOnlyCollection<ResourceDescriptor> GetResourceDescriptors()
2727
{
2828
EnsureAssembliesScanned();
2929

30-
return _resourceDescriptorsPerAssembly.Select(pair => (pair.Key, pair.Value)).ToArray();
30+
return _resourceDescriptorsPerAssembly.SelectMany(pair => pair.Value).ToArray();
31+
}
32+
33+
public IReadOnlyCollection<Assembly> GetAssemblies()
34+
{
35+
EnsureAssembliesScanned();
36+
37+
return _resourceDescriptorsPerAssembly.Keys;
3138
}
3239

3340
private void EnsureAssembliesScanned()

src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,21 @@ public ServiceDiscoveryFacade AddAssembly(Assembly assembly)
109109

110110
internal void DiscoverResources()
111111
{
112-
foreach (ResourceDescriptor resourceDescriptor in _assemblyCache.GetResourceDescriptorsPerAssembly().SelectMany(tuple => tuple.resourceDescriptors))
112+
foreach (ResourceDescriptor resourceDescriptor in _assemblyCache.GetResourceDescriptors())
113113
{
114114
AddResource(resourceDescriptor);
115115
}
116116
}
117117

118118
internal void DiscoverInjectables()
119119
{
120-
foreach ((Assembly assembly, IReadOnlyCollection<ResourceDescriptor> resourceDescriptors) in _assemblyCache.GetResourceDescriptorsPerAssembly())
120+
IReadOnlyCollection<ResourceDescriptor> descriptors = _assemblyCache.GetResourceDescriptors();
121+
IReadOnlyCollection<Assembly> assemblies = _assemblyCache.GetAssemblies();
122+
123+
foreach (Assembly assembly in assemblies)
121124
{
122125
AddDbContextResolvers(assembly);
123-
AddInjectables(resourceDescriptors, assembly);
126+
AddInjectables(descriptors, assembly);
124127
}
125128
}
126129

test/UnitTests/Graph/ResourceDescriptorAssemblyCacheTests.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Reflection;
4+
using FluentAssertions;
55
using JsonApiDotNetCore.Configuration;
66
using JsonApiDotNetCore.Resources;
77
using Xunit;
@@ -20,12 +20,11 @@ public void GetResourceDescriptorsPerAssembly_Locates_Identifiable_Resource()
2020
assemblyCache.RegisterAssembly(resourceType.Assembly);
2121

2222
// Act
23-
IEnumerable<(Assembly assembly, IReadOnlyCollection<ResourceDescriptor> resourceDescriptors)> results =
24-
assemblyCache.GetResourceDescriptorsPerAssembly();
23+
IReadOnlyCollection<ResourceDescriptor> descriptors = assemblyCache.GetResourceDescriptors();
2524

2625
// Assert
27-
Assert.Contains(results,
28-
result => result.resourceDescriptors != null && result.resourceDescriptors.Any(descriptor => descriptor.ResourceType == resourceType));
26+
descriptors.Should().NotBeEmpty();
27+
descriptors.Should().ContainSingle(descriptor => descriptor.ResourceType == resourceType);
2928
}
3029

3130
[Fact]
@@ -38,14 +37,11 @@ public void GetResourceDescriptorsPerAssembly_Only_Contains_IIdentifiable_Types(
3837
assemblyCache.RegisterAssembly(resourceType.Assembly);
3938

4039
// Act
41-
IEnumerable<(Assembly assembly, IReadOnlyCollection<ResourceDescriptor> resourceDescriptors)> results =
42-
assemblyCache.GetResourceDescriptorsPerAssembly();
40+
IReadOnlyCollection<ResourceDescriptor> descriptors = assemblyCache.GetResourceDescriptors();
4341

4442
// Assert
45-
foreach (ResourceDescriptor resourceDescriptor in results.SelectMany(result => result.resourceDescriptors))
46-
{
47-
Assert.True(typeof(IIdentifiable).IsAssignableFrom(resourceDescriptor.ResourceType));
48-
}
43+
descriptors.Should().NotBeEmpty();
44+
descriptors.Select(descriptor => descriptor.ResourceType).Should().AllBeAssignableTo<IIdentifiable>();
4945
}
5046
}
5147
}

0 commit comments

Comments
 (0)