From 35bd5a6b3e418e1c48f522f249955e336800357e Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Wed, 12 May 2021 11:05:20 +0200 Subject: [PATCH] Fixes auto-discovery when resources, DbContexts and injectables are spread over different assemblies --- .../ResourceDescriptorAssemblyCache.cs | 11 +++++++++-- .../Configuration/ServiceDiscoveryFacade.cs | 9 ++++++--- .../ResourceDescriptorAssemblyCacheTests.cs | 18 +++++++----------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/JsonApiDotNetCore/Configuration/ResourceDescriptorAssemblyCache.cs b/src/JsonApiDotNetCore/Configuration/ResourceDescriptorAssemblyCache.cs index 7bf545b997..ed919c044d 100644 --- a/src/JsonApiDotNetCore/Configuration/ResourceDescriptorAssemblyCache.cs +++ b/src/JsonApiDotNetCore/Configuration/ResourceDescriptorAssemblyCache.cs @@ -23,11 +23,18 @@ public void RegisterAssembly(Assembly assembly) } } - public IEnumerable<(Assembly assembly, IReadOnlyCollection resourceDescriptors)> GetResourceDescriptorsPerAssembly() + public IReadOnlyCollection GetResourceDescriptors() { EnsureAssembliesScanned(); - return _resourceDescriptorsPerAssembly.Select(pair => (pair.Key, pair.Value)).ToArray(); + return _resourceDescriptorsPerAssembly.SelectMany(pair => pair.Value).ToArray(); + } + + public IReadOnlyCollection GetAssemblies() + { + EnsureAssembliesScanned(); + + return _resourceDescriptorsPerAssembly.Keys; } private void EnsureAssembliesScanned() diff --git a/src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs b/src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs index b18c8826f6..a15e7c60e3 100644 --- a/src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs +++ b/src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs @@ -109,7 +109,7 @@ public ServiceDiscoveryFacade AddAssembly(Assembly assembly) internal void DiscoverResources() { - foreach (ResourceDescriptor resourceDescriptor in _assemblyCache.GetResourceDescriptorsPerAssembly().SelectMany(tuple => tuple.resourceDescriptors)) + foreach (ResourceDescriptor resourceDescriptor in _assemblyCache.GetResourceDescriptors()) { AddResource(resourceDescriptor); } @@ -117,10 +117,13 @@ internal void DiscoverResources() internal void DiscoverInjectables() { - foreach ((Assembly assembly, IReadOnlyCollection resourceDescriptors) in _assemblyCache.GetResourceDescriptorsPerAssembly()) + IReadOnlyCollection descriptors = _assemblyCache.GetResourceDescriptors(); + IReadOnlyCollection assemblies = _assemblyCache.GetAssemblies(); + + foreach (Assembly assembly in assemblies) { AddDbContextResolvers(assembly); - AddInjectables(resourceDescriptors, assembly); + AddInjectables(descriptors, assembly); } } diff --git a/test/UnitTests/Graph/ResourceDescriptorAssemblyCacheTests.cs b/test/UnitTests/Graph/ResourceDescriptorAssemblyCacheTests.cs index b59c40708c..99e8f54931 100644 --- a/test/UnitTests/Graph/ResourceDescriptorAssemblyCacheTests.cs +++ b/test/UnitTests/Graph/ResourceDescriptorAssemblyCacheTests.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; +using FluentAssertions; using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Resources; using Xunit; @@ -20,12 +20,11 @@ public void GetResourceDescriptorsPerAssembly_Locates_Identifiable_Resource() assemblyCache.RegisterAssembly(resourceType.Assembly); // Act - IEnumerable<(Assembly assembly, IReadOnlyCollection resourceDescriptors)> results = - assemblyCache.GetResourceDescriptorsPerAssembly(); + IReadOnlyCollection descriptors = assemblyCache.GetResourceDescriptors(); // Assert - Assert.Contains(results, - result => result.resourceDescriptors != null && result.resourceDescriptors.Any(descriptor => descriptor.ResourceType == resourceType)); + descriptors.Should().NotBeEmpty(); + descriptors.Should().ContainSingle(descriptor => descriptor.ResourceType == resourceType); } [Fact] @@ -38,14 +37,11 @@ public void GetResourceDescriptorsPerAssembly_Only_Contains_IIdentifiable_Types( assemblyCache.RegisterAssembly(resourceType.Assembly); // Act - IEnumerable<(Assembly assembly, IReadOnlyCollection resourceDescriptors)> results = - assemblyCache.GetResourceDescriptorsPerAssembly(); + IReadOnlyCollection descriptors = assemblyCache.GetResourceDescriptors(); // Assert - foreach (ResourceDescriptor resourceDescriptor in results.SelectMany(result => result.resourceDescriptors)) - { - Assert.True(typeof(IIdentifiable).IsAssignableFrom(resourceDescriptor.ResourceType)); - } + descriptors.Should().NotBeEmpty(); + descriptors.Select(descriptor => descriptor.ResourceType).Should().AllBeAssignableTo(); } } }