Skip to content

Commit b55c295

Browse files
author
Bart Koelman
committed
Log resource graph validation warnings at configuration time instead of postponing them.
1 parent 26faa2d commit b55c295

22 files changed

+100
-55
lines changed

benchmarks/DependencyFactory.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using JsonApiDotNetCore.Internal.Contracts;
55
using JsonApiDotNetCore.Models;
66
using JsonApiDotNetCore.Query;
7+
using Microsoft.Extensions.Logging.Abstractions;
78
using Moq;
89

910
namespace Benchmarks
@@ -12,7 +13,7 @@ internal static class DependencyFactory
1213
{
1314
public static IResourceGraph CreateResourceGraph(IJsonApiOptions options)
1415
{
15-
IResourceGraphBuilder builder = new ResourceGraphBuilder(options);
16+
IResourceGraphBuilder builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
1617
builder.AddResource<BenchmarkResource>(BenchmarkResourcePublicNames.Type);
1718
return builder.Build();
1819
}

src/JsonApiDotNetCore/Builders/JsonApiApplicationBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void ConfigureMvc(Type dbContextType)
6666
_resourceGraphBuilder = intermediateProvider.GetRequiredService<IResourceGraphBuilder>();
6767
_serviceDiscoveryFacade = intermediateProvider.GetRequiredService<IServiceDiscoveryFacade>();
6868
_dbContextType = dbContextType;
69-
69+
7070
AddResourceTypesFromDbContext(intermediateProvider);
7171

7272
var exceptionFilterProvider = intermediateProvider.GetRequiredService<IJsonApiExceptionFilterProvider>();

src/JsonApiDotNetCore/Builders/ResourceGraphBuilder.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,20 @@ namespace JsonApiDotNetCore.Builders
1818
public class ResourceGraphBuilder : IResourceGraphBuilder
1919
{
2020
private readonly IJsonApiOptions _options;
21+
private readonly ILogger<ResourceGraphBuilder> _logger;
2122
private readonly List<ResourceContext> _resources = new List<ResourceContext>();
22-
private readonly List<ValidationResult> _validationResults = new List<ValidationResult>();
2323

24-
public ResourceGraphBuilder(IJsonApiOptions options)
24+
public ResourceGraphBuilder(IJsonApiOptions options, ILoggerFactory loggerFactory)
2525
{
2626
_options = options;
27+
_logger = loggerFactory.CreateLogger<ResourceGraphBuilder>();
2728
}
2829

2930
/// <inheritdoc />
3031
public IResourceGraph Build()
3132
{
3233
_resources.ForEach(SetResourceLinksOptions);
33-
var resourceGraph = new ResourceGraph(_resources, _validationResults);
34-
return resourceGraph;
34+
return new ResourceGraph(_resources);
3535
}
3636

3737
private void SetResourceLinksOptions(ResourceContext resourceContext)
@@ -67,7 +67,7 @@ public IResourceGraphBuilder AddResource(Type resourceType, Type idType = null,
6767
}
6868
else
6969
{
70-
_validationResults.Add(new ValidationResult(LogLevel.Warning, $"{resourceType} does not implement '{nameof(IIdentifiable)}'. "));
70+
_logger.LogWarning($"Entity '{resourceType}' does not implement '{nameof(IIdentifiable)}'.");
7171
}
7272
}
7373

src/JsonApiDotNetCore/Extensions/ApplicationBuilderExtensions.cs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
using JsonApiDotNetCore.Builders;
21
using JsonApiDotNetCore.Internal;
3-
using JsonApiDotNetCore.Internal.Contracts;
42
using JsonApiDotNetCore.Middleware;
53
using Microsoft.AspNetCore.Builder;
64
using Microsoft.Extensions.DependencyInjection;
7-
using Microsoft.Extensions.Logging;
85

96
namespace JsonApiDotNetCore
107
{
@@ -31,7 +28,6 @@ public static class ApplicationBuilderExtensions
3128
/// </example>
3229
public static void UseJsonApi(this IApplicationBuilder app, bool skipRegisterMiddleware = false, bool useAuthentication = false, bool useAuthorization = false)
3330
{
34-
LogResourceGraphValidations(app);
3531
using (var scope = app.ApplicationServices.CreateScope())
3632
{
3733
var inverseRelationshipResolver = scope.ServiceProvider.GetService<IInverseRelationships>();
@@ -60,16 +56,5 @@ public static void UseJsonApi(this IApplicationBuilder app, bool skipRegisterMid
6056
app.UseEndpoints(endpoints => endpoints.MapControllers());
6157
}
6258
}
63-
64-
private static void LogResourceGraphValidations(IApplicationBuilder app)
65-
{
66-
var logger = (ILogger)app.ApplicationServices.GetService(typeof(ILogger<ResourceGraphBuilder>));
67-
var resourceGraph = (ResourceGraph)app.ApplicationServices.GetService(typeof(IResourceGraph));
68-
69-
if (logger != null)
70-
{
71-
resourceGraph?.ValidationResults.ForEach(v => logger.Log(v.LogLevel, null, v.Message));
72-
}
73-
}
7459
}
7560
}

src/JsonApiDotNetCore/Internal/ResourceGraph.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@ namespace JsonApiDotNetCore.Internal
1212
/// </summary>
1313
public class ResourceGraph : IResourceGraph
1414
{
15-
internal List<ValidationResult> ValidationResults { get; }
1615
private List<ResourceContext> Resources { get; }
1716

18-
public ResourceGraph(List<ResourceContext> resources, List<ValidationResult> validationResults = null)
17+
public ResourceGraph(List<ResourceContext> resources)
1918
{
2019
Resources = resources;
21-
ValidationResults = validationResults;
2220
}
2321

2422
/// <inheritdoc />

test/DiscoveryTests/ServiceDiscoveryFacadeTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Microsoft.EntityFrameworkCore;
1919
using Microsoft.Extensions.DependencyInjection;
2020
using Microsoft.Extensions.Logging;
21+
using Microsoft.Extensions.Logging.Abstractions;
2122
using Moq;
2223
using Xunit;
2324

@@ -46,7 +47,7 @@ public ServiceDiscoveryFacadeTests()
4647
_services.AddScoped((_) => new Mock<IResourceContextProvider>().Object);
4748
_services.AddScoped(typeof(IResourceChangeTracker<>), typeof(DefaultResourceChangeTracker<>));
4849

49-
_resourceGraphBuilder = new ResourceGraphBuilder(options);
50+
_resourceGraphBuilder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
5051
}
5152

5253
private ServiceDiscoveryFacade Facade => new ServiceDiscoveryFacade(_services, _resourceGraphBuilder);

test/IntegrationTests/Data/EntityRepositoryTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public async Task Paging_PageNumberIsNegative_GiveBackReverseAmountOfIds(int pag
162162
{
163163
var contextResolverMock = new Mock<IDbContextResolver>();
164164
contextResolverMock.Setup(m => m.GetContext()).Returns(context);
165-
var resourceGraph = new ResourceGraphBuilder(new JsonApiOptions()).AddResource<TodoItem>().Build();
165+
var resourceGraph = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance).AddResource<TodoItem>().Build();
166166
var targetedFields = new Mock<ITargetedFields>();
167167
var repository = new DefaultResourceRepository<TodoItem>(targetedFields.Object, contextResolverMock.Object, resourceGraph, null, NullLoggerFactory.Instance);
168168
return (repository, targetedFields);

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/DeeplyNestedInclusionTests.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using JsonApiDotNetCoreExample.Models;
1212
using JsonApiDotNetCoreExampleTests.Helpers.Extensions;
1313
using JsonApiDotNetCoreExampleTests.Helpers.Models;
14+
using Microsoft.Extensions.Logging.Abstractions;
1415
using Newtonsoft.Json;
1516
using Xunit;
1617
using Person = JsonApiDotNetCoreExample.Models.Person;
@@ -42,7 +43,11 @@ public async Task Can_Include_Nested_Relationships()
4243
const string route = "/api/v1/todoItems?include=collection.owner";
4344

4445
var options = _fixture.GetService<IJsonApiOptions>();
45-
var resourceGraph = new ResourceGraphBuilder(options).AddResource<TodoItemClient>("todoItems").AddResource<TodoItemCollection, Guid>().AddResource<Person>().Build();
46+
var resourceGraph = new ResourceGraphBuilder(options, NullLoggerFactory.Instance)
47+
.AddResource<TodoItemClient>("todoItems")
48+
.AddResource<TodoItemCollection, Guid>()
49+
.AddResource<Person>()
50+
.Build();
4651
var deserializer = new ResponseDeserializer(resourceGraph);
4752
var todoItem = new TodoItem
4853
{

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/EndToEndTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using JsonApiDotNetCoreExampleTests.Helpers.Models;
1818
using Microsoft.AspNetCore.Hosting;
1919
using Microsoft.AspNetCore.TestHost;
20+
using Microsoft.Extensions.Logging.Abstractions;
2021
using Xunit;
2122

2223
namespace JsonApiDotNetCoreExampleTests.Acceptance.Spec
@@ -78,7 +79,7 @@ protected IResponseDeserializer GetDeserializer()
7879
var options = GetService<IJsonApiOptions>();
7980
var formatter = new ResourceNameFormatter(options);
8081
var resourcesContexts = GetService<IResourceGraph>().GetResourceContexts();
81-
var builder = new ResourceGraphBuilder(options);
82+
var builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
8283
foreach (var rc in resourcesContexts)
8384
{
8485
if (rc.ResourceType == typeof(TodoItem) || rc.ResourceType == typeof(TodoItemCollection))

test/JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using JsonApiDotNetCoreExampleTests.Helpers.Models;
1414
using JsonApiDotNetCoreExample.Models;
1515
using JsonApiDotNetCore.Internal.Contracts;
16+
using Microsoft.Extensions.Logging.Abstractions;
1617

1718
namespace JsonApiDotNetCoreExampleTests.Acceptance
1819
{
@@ -50,7 +51,7 @@ public IResponseDeserializer GetDeserializer()
5051
{
5152
var options = GetService<IJsonApiOptions>();
5253

53-
var resourceGraph = new ResourceGraphBuilder(options)
54+
var resourceGraph = new ResourceGraphBuilder(options, NullLoggerFactory.Instance)
5455
.AddResource<PersonRole>()
5556
.AddResource<Article>()
5657
.AddResource<Tag>()

0 commit comments

Comments
 (0)