Skip to content

Generic resource definitions #832

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Sep 18, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Review feedback
  • Loading branch information
Bart Koelman committed Sep 17, 2020
commit f196f108324e332db1472426741330fe1afb19fe
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public JsonApiApplicationBuilder(IServiceCollection services, IMvcCoreBuilder mv
var loggerFactory = _intermediateProvider.GetService<ILoggerFactory>();

_resourceGraphBuilder = new ResourceGraphBuilder(_options, loggerFactory);
_serviceDiscoveryFacade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, loggerFactory);
_serviceDiscoveryFacade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, loggerFactory);
}

/// <summary>
Expand Down Expand Up @@ -108,7 +108,7 @@ public void ConfigureMvc()
/// </summary>
public void DiscoverInjectables()
{
_serviceDiscoveryFacade.DiscoverInjectables(_options.EnableResourceHooks);
_serviceDiscoveryFacade.DiscoverInjectables();
}

/// <summary>
Expand Down
8 changes: 5 additions & 3 deletions src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,11 @@ public class ServiceDiscoveryFacade
private readonly ILogger<ServiceDiscoveryFacade> _logger;
private readonly IServiceCollection _services;
private readonly ResourceGraphBuilder _resourceGraphBuilder;
private readonly IJsonApiOptions _options;
private readonly IdentifiableTypeCache _typeCache = new IdentifiableTypeCache();
private readonly Dictionary<Assembly, IList<ResourceDescriptor>> _resourceDescriptorsPerAssemblyCache = new Dictionary<Assembly, IList<ResourceDescriptor>>();

public ServiceDiscoveryFacade(IServiceCollection services, ResourceGraphBuilder resourceGraphBuilder, ILoggerFactory loggerFactory)
public ServiceDiscoveryFacade(IServiceCollection services, ResourceGraphBuilder resourceGraphBuilder, IJsonApiOptions options, ILoggerFactory loggerFactory)
{
if (loggerFactory == null)
{
Expand All @@ -70,6 +71,7 @@ public ServiceDiscoveryFacade(IServiceCollection services, ResourceGraphBuilder
_logger = loggerFactory.CreateLogger<ServiceDiscoveryFacade>();
_services = services ?? throw new ArgumentNullException(nameof(services));
_resourceGraphBuilder = resourceGraphBuilder ?? throw new ArgumentNullException(nameof(resourceGraphBuilder));
_options = options ?? throw new ArgumentNullException(nameof(options));
}

/// <summary>
Expand Down Expand Up @@ -106,7 +108,7 @@ internal void DiscoverResources()
}
}

internal void DiscoverInjectables(bool enableResourceHooks)
internal void DiscoverInjectables()
{
foreach (var (assembly, discoveredResourceDescriptors) in _resourceDescriptorsPerAssemblyCache.ToArray())
{
Expand All @@ -120,7 +122,7 @@ internal void DiscoverInjectables(bool enableResourceHooks)
AddRepositories(assembly, descriptor);
AddResourceDefinitions(assembly, descriptor);

if (enableResourceHooks)
if (_options.EnableResourceHooks)
{
AddResourceHookDefinitions(assembly, descriptor);
}
Expand Down
29 changes: 15 additions & 14 deletions test/DiscoveryTests/ServiceDiscoveryFacadeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,16 @@ namespace DiscoveryTests
public sealed class ServiceDiscoveryFacadeTests
{
private readonly IServiceCollection _services = new ServiceCollection();
private readonly JsonApiOptions _options = new JsonApiOptions();
private readonly ResourceGraphBuilder _resourceGraphBuilder;

public ServiceDiscoveryFacadeTests()
{
var options = new JsonApiOptions();

var dbResolverMock = new Mock<IDbContextResolver>();
dbResolverMock.Setup(m => m.GetContext()).Returns(new Mock<DbContext>().Object);
_services.AddScoped(_ => dbResolverMock.Object);

_services.AddSingleton<IJsonApiOptions>(options);
_services.AddSingleton<IJsonApiOptions>(_options);
_services.AddSingleton<ILoggerFactory>(new LoggerFactory());
_services.AddScoped(_ => new Mock<IJsonApiRequest>().Object);
_services.AddScoped(_ => new Mock<ITargetedFields>().Object);
Expand All @@ -42,14 +41,14 @@ public ServiceDiscoveryFacadeTests()
_services.AddScoped(_ => new Mock<IPaginationContext>().Object);
_services.AddScoped(_ => new Mock<IQueryLayerComposer>().Object);

_resourceGraphBuilder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
_resourceGraphBuilder = new ResourceGraphBuilder(_options, NullLoggerFactory.Instance);
}

[Fact]
public void DiscoverResources_Adds_Resources_From_Added_Assembly_To_Graph()
{
// Arrange
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, NullLoggerFactory.Instance);
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, NullLoggerFactory.Instance);
facade.AddAssembly(typeof(Person).Assembly);

// Act
Expand All @@ -67,7 +66,7 @@ public void DiscoverResources_Adds_Resources_From_Added_Assembly_To_Graph()
public void DiscoverResources_Adds_Resources_From_Current_Assembly_To_Graph()
{
// Arrange
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, NullLoggerFactory.Instance);
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, NullLoggerFactory.Instance);
facade.AddCurrentAssembly();

// Act
Expand All @@ -83,11 +82,11 @@ public void DiscoverResources_Adds_Resources_From_Current_Assembly_To_Graph()
public void DiscoverInjectables_Adds_Resource_Services_From_Current_Assembly_To_Container()
{
// Arrange
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, NullLoggerFactory.Instance);
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, NullLoggerFactory.Instance);
facade.AddCurrentAssembly();

// Act
facade.DiscoverInjectables(false);
facade.DiscoverInjectables();

// Assert
var services = _services.BuildServiceProvider();
Expand All @@ -99,11 +98,11 @@ public void DiscoverInjectables_Adds_Resource_Services_From_Current_Assembly_To_
public void DiscoverInjectables_Adds_Resource_Repositories_From_Current_Assembly_To_Container()
{
// Arrange
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, NullLoggerFactory.Instance);
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, NullLoggerFactory.Instance);
facade.AddCurrentAssembly();

// Act
facade.DiscoverInjectables(false);
facade.DiscoverInjectables();

// Assert
var services = _services.BuildServiceProvider();
Expand All @@ -114,11 +113,11 @@ public void DiscoverInjectables_Adds_Resource_Repositories_From_Current_Assembly
public void AddCurrentAssembly_Adds_Resource_Definitions_From_Current_Assembly_To_Container()
{
// Arrange
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, NullLoggerFactory.Instance);
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, NullLoggerFactory.Instance);
facade.AddCurrentAssembly();

// Act
facade.DiscoverInjectables(false);
facade.DiscoverInjectables();

// Assert
var services = _services.BuildServiceProvider();
Expand All @@ -129,11 +128,13 @@ public void AddCurrentAssembly_Adds_Resource_Definitions_From_Current_Assembly_T
public void AddCurrentAssembly_Adds_Resource_Hooks_Definitions_From_Current_Assembly_To_Container()
{
// Arrange
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, NullLoggerFactory.Instance);
ServiceDiscoveryFacade facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, NullLoggerFactory.Instance);
facade.AddCurrentAssembly();

_options.EnableResourceHooks = true;

// Act
facade.DiscoverInjectables(true);
facade.DiscoverInjectables();

// Assert
var services = _services.BuildServiceProvider();
Expand Down