Skip to content

Commit 9d057f1

Browse files
author
Bart Koelman
committed
Renamed ResourceContext to ResourceType and exposed it through relationship left/right. This enabled to reduce many resource graph lookups from the codebase.
1 parent b5eaabd commit 9d057f1

File tree

126 files changed

+1070
-1149
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+1070
-1149
lines changed

benchmarks/Deserialization/DeserializationBenchmarkBase.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ protected DeserializationBenchmarkBase()
3737
var targetedFields = new TargetedFields();
3838

3939
var resourceIdentifierObjectAdapter = new ResourceIdentifierObjectAdapter(resourceGraph, resourceFactory);
40-
var relationshipDataAdapter = new RelationshipDataAdapter(resourceGraph, resourceIdentifierObjectAdapter);
40+
var relationshipDataAdapter = new RelationshipDataAdapter(resourceIdentifierObjectAdapter);
4141
var resourceObjectAdapter = new ResourceObjectAdapter(resourceGraph, resourceFactory, options, relationshipDataAdapter);
4242
var resourceDataAdapter = new ResourceDataAdapter(resourceDefinitionAccessor, resourceObjectAdapter);
4343

4444
var atomicReferenceAdapter = new AtomicReferenceAdapter(resourceGraph, resourceFactory);
4545
var atomicOperationResourceDataAdapter = new ResourceDataInOperationsRequestAdapter(resourceDefinitionAccessor, resourceObjectAdapter);
4646

47-
var atomicOperationObjectAdapter = new AtomicOperationObjectAdapter(resourceGraph, options, atomicReferenceAdapter,
47+
var atomicOperationObjectAdapter = new AtomicOperationObjectAdapter(options, atomicReferenceAdapter,
4848
atomicOperationResourceDataAdapter, relationshipDataAdapter);
4949

5050
var resourceDocumentAdapter = new DocumentInResourceOrRelationshipRequestAdapter(options, resourceDataAdapter, relationshipDataAdapter);

benchmarks/Deserialization/ResourceDeserializationBenchmarks.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ protected override JsonApiRequest CreateJsonApiRequest(IResourceGraph resourceGr
143143
return new()
144144
{
145145
Kind = EndpointKind.Primary,
146-
PrimaryResource = resourceGraph.GetResourceContext<ResourceA>(),
146+
PrimaryResourceType = resourceGraph.GetResourceType<ResourceA>(),
147147
WriteOperation = WriteOperationKind.CreateResource
148148
};
149149
}

benchmarks/Query/QueryParserBenchmarks.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public QueryParserBenchmarks()
3636

3737
var request = new JsonApiRequest
3838
{
39-
PrimaryResource = resourceGraph.GetResourceContext(typeof(BenchmarkResource)),
39+
PrimaryResourceType = resourceGraph.GetResourceType(typeof(BenchmarkResource)),
4040
IsCollection = true
4141
};
4242

benchmarks/Serialization/OperationsSerializationBenchmarks.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ public string SerializeOperationsResponse()
122122

123123
protected override JsonApiRequest CreateJsonApiRequest(IResourceGraph resourceGraph)
124124
{
125-
return new JsonApiRequest
125+
return new()
126126
{
127127
Kind = EndpointKind.AtomicOperations,
128-
PrimaryResource = resourceGraph.GetResourceContext<ResourceA>()
128+
PrimaryResourceType = resourceGraph.GetResourceType<ResourceA>()
129129
};
130130
}
131131

benchmarks/Serialization/ResourceSerializationBenchmarks.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -113,21 +113,21 @@ public string SerializeResourceResponse()
113113

114114
protected override JsonApiRequest CreateJsonApiRequest(IResourceGraph resourceGraph)
115115
{
116-
return new JsonApiRequest
116+
return new()
117117
{
118118
Kind = EndpointKind.Primary,
119-
PrimaryResource = resourceGraph.GetResourceContext<ResourceA>()
119+
PrimaryResourceType = resourceGraph.GetResourceType<ResourceA>()
120120
};
121121
}
122122

123123
protected override IEvaluatedIncludeCache CreateEvaluatedIncludeCache(IResourceGraph resourceGraph)
124124
{
125-
ResourceContext resourceContext = resourceGraph.GetResourceContext<ResourceA>();
125+
ResourceType resourceAType = resourceGraph.GetResourceType<ResourceA>();
126126

127-
RelationshipAttribute single2 = resourceContext.GetRelationshipByPropertyName(nameof(ResourceA.Single2));
128-
RelationshipAttribute single3 = resourceContext.GetRelationshipByPropertyName(nameof(ResourceA.Single3));
129-
RelationshipAttribute multi4 = resourceContext.GetRelationshipByPropertyName(nameof(ResourceA.Multi4));
130-
RelationshipAttribute multi5 = resourceContext.GetRelationshipByPropertyName(nameof(ResourceA.Multi5));
127+
RelationshipAttribute single2 = resourceAType.GetRelationshipByPropertyName(nameof(ResourceA.Single2));
128+
RelationshipAttribute single3 = resourceAType.GetRelationshipByPropertyName(nameof(ResourceA.Single3));
129+
RelationshipAttribute multi4 = resourceAType.GetRelationshipByPropertyName(nameof(ResourceA.Multi4));
130+
RelationshipAttribute multi5 = resourceAType.GetRelationshipByPropertyName(nameof(ResourceA.Multi5));
131131

132132
ImmutableArray<ResourceFieldAttribute> chain = ArrayFactory.Create<ResourceFieldAttribute>(single2, single3, multi4, multi5).ToImmutableArray();
133133
IEnumerable<ResourceFieldChainExpression> chains = new ResourceFieldChainExpression(chain).AsEnumerable();

benchmarks/Serialization/SerializationBenchmarkBase.cs

+13-13
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ protected SerializationBenchmarkBase()
5555
var sparseFieldSetCache = new SparseFieldSetCache(constraintProviders, resourceDefinitionAccessor);
5656
var requestQueryStringAccessor = new FakeRequestQueryStringAccessor();
5757

58-
ResponseModelAdapter = new ResponseModelAdapter(request, options, ResourceGraph, linkBuilder, metaBuilder, resourceDefinitionAccessor,
59-
evaluatedIncludeCache, sparseFieldSetCache, requestQueryStringAccessor);
58+
ResponseModelAdapter = new ResponseModelAdapter(request, options, linkBuilder, metaBuilder, resourceDefinitionAccessor, evaluatedIncludeCache,
59+
sparseFieldSetCache, requestQueryStringAccessor);
6060
}
6161

6262
protected abstract JsonApiRequest CreateJsonApiRequest(IResourceGraph resourceGraph);
@@ -129,37 +129,37 @@ public sealed class ResourceA : Identifiable
129129

130130
private sealed class FakeResourceDefinitionAccessor : IResourceDefinitionAccessor
131131
{
132-
public IImmutableSet<IncludeElementExpression> OnApplyIncludes(Type resourceType, IImmutableSet<IncludeElementExpression> existingIncludes)
132+
public IImmutableSet<IncludeElementExpression> OnApplyIncludes(ResourceType resourceType, IImmutableSet<IncludeElementExpression> existingIncludes)
133133
{
134134
return existingIncludes;
135135
}
136136

137-
public FilterExpression OnApplyFilter(Type resourceType, FilterExpression existingFilter)
137+
public FilterExpression OnApplyFilter(ResourceType resourceType, FilterExpression existingFilter)
138138
{
139139
return existingFilter;
140140
}
141141

142-
public SortExpression OnApplySort(Type resourceType, SortExpression existingSort)
142+
public SortExpression OnApplySort(ResourceType resourceType, SortExpression existingSort)
143143
{
144144
return existingSort;
145145
}
146146

147-
public PaginationExpression OnApplyPagination(Type resourceType, PaginationExpression existingPagination)
147+
public PaginationExpression OnApplyPagination(ResourceType resourceType, PaginationExpression existingPagination)
148148
{
149149
return existingPagination;
150150
}
151151

152-
public SparseFieldSetExpression OnApplySparseFieldSet(Type resourceType, SparseFieldSetExpression existingSparseFieldSet)
152+
public SparseFieldSetExpression OnApplySparseFieldSet(ResourceType resourceType, SparseFieldSetExpression existingSparseFieldSet)
153153
{
154154
return existingSparseFieldSet;
155155
}
156156

157-
public object GetQueryableHandlerForQueryStringParameter(Type resourceType, string parameterName)
157+
public object GetQueryableHandlerForQueryStringParameter(Type resourceClrType, string parameterName)
158158
{
159159
return null;
160160
}
161161

162-
public IDictionary<string, object> GetMeta(Type resourceType, IIdentifiable resourceInstance)
162+
public IDictionary<string, object> GetMeta(ResourceType resourceType, IIdentifiable resourceInstance)
163163
{
164164
return null;
165165
}
@@ -223,23 +223,23 @@ private sealed class FakeLinkBuilder : ILinkBuilder
223223
{
224224
public TopLevelLinks GetTopLevelLinks()
225225
{
226-
return new TopLevelLinks
226+
return new()
227227
{
228228
Self = "TopLevel:Self"
229229
};
230230
}
231231

232-
public ResourceLinks GetResourceLinks(string resourceName, string id)
232+
public ResourceLinks GetResourceLinks(ResourceType resourceType, string id)
233233
{
234-
return new ResourceLinks
234+
return new()
235235
{
236236
Self = "Resource:Self"
237237
};
238238
}
239239

240240
public RelationshipLinks GetRelationshipLinks(RelationshipAttribute relationship, IIdentifiable leftResource)
241241
{
242-
return new RelationshipLinks
242+
return new()
243243
{
244244
Self = "Relationship:Self",
245245
Related = "Relationship:Related"

docs/getting-started/step-by-step.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,18 @@ public void Configure(IApplicationBuilder app)
114114
One way to seed the database is in your Configure method:
115115

116116
```c#
117-
public void Configure(IApplicationBuilder app, AppDbContext context)
117+
public void Configure(IApplicationBuilder app, AppDbContext dbContext)
118118
{
119-
context.Database.EnsureCreated();
119+
dbContext.Database.EnsureCreated();
120120

121-
if (!context.People.Any())
121+
if (!dbContext.People.Any())
122122
{
123-
context.People.Add(new Person
123+
dbContext.People.Add(new Person
124124
{
125125
Name = "John Doe"
126126
});
127127

128-
context.SaveChanges();
128+
dbContext.SaveChanges();
129129
}
130130

131131
app.UseRouting();

docs/usage/extensibility/repositories.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ public class ArticleRepository : EntityFrameworkCoreRepository<Article>
3939
private readonly IAuthenticationService _authenticationService;
4040

4141
public ArticleRepository(IAuthenticationService authenticationService,
42-
ITargetedFields targetedFields, IDbContextResolver contextResolver,
42+
ITargetedFields targetedFields, IDbContextResolver dbContextResolver,
4343
IResourceGraph resourceGraph, IGenericServiceFactory genericServiceFactory,
4444
IResourceFactory resourceFactory,
4545
IEnumerable<IQueryConstraintProvider> constraintProviders,
4646
ILoggerFactory loggerFactory)
47-
: base(targetedFields, contextResolver, resourceGraph, genericServiceFactory,
47+
: base(targetedFields, dbContextResolver, resourceGraph, genericServiceFactory,
4848
resourceFactory, constraintProviders, loggerFactory)
4949
{
5050
_authenticationService = authenticationService;
@@ -68,13 +68,13 @@ public class DbContextARepository<TResource> : EntityFrameworkCoreRepository<TRe
6868
where TResource : class, IIdentifiable<int>
6969
{
7070
public DbContextARepository(ITargetedFields targetedFields,
71-
DbContextResolver<DbContextA> contextResolver,
71+
DbContextResolver<DbContextA> dbContextResolver,
7272
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
7373
IResourceGraph resourceGraph, IGenericServiceFactory genericServiceFactory,
7474
IResourceFactory resourceFactory,
7575
IEnumerable<IQueryConstraintProvider> constraintProviders,
7676
ILoggerFactory loggerFactory)
77-
: base(targetedFields, contextResolver, resourceGraph, genericServiceFactory,
77+
: base(targetedFields, dbContextResolver, resourceGraph, genericServiceFactory,
7878
resourceFactory, constraintProviders, loggerFactory)
7979
{
8080
}

docs/usage/extensibility/resource-definitions.md

+2-5
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,8 @@ public class AccountDefinition : JsonApiResourceDefinition<Account>
172172

173173
public override FilterExpression OnApplyFilter(FilterExpression existingFilter)
174174
{
175-
var resourceContext = ResourceGraph.GetResourceContext<Account>();
176-
177-
var isSuspendedAttribute =
178-
resourceContext.Attributes.Single(account =>
179-
account.Property.Name == nameof(Account.IsSuspended));
175+
var isSuspendedAttribute = ResourceType.Attributes.Single(account =>
176+
account.Property.Name == nameof(Account.IsSuspended));
180177

181178
var isNotSuspended = new ComparisonExpression(ComparisonOperator.Equals,
182179
new ResourceFieldChainExpression(isSuspendedAttribute),

src/Examples/GettingStarted/Startup.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@ public void ConfigureServices(IServiceCollection services)
2626

2727
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
2828
[UsedImplicitly]
29-
public void Configure(IApplicationBuilder app, SampleDbContext context)
29+
public void Configure(IApplicationBuilder app, SampleDbContext dbContext)
3030
{
31-
context.Database.EnsureDeleted();
32-
context.Database.EnsureCreated();
33-
CreateSampleData(context);
31+
dbContext.Database.EnsureDeleted();
32+
dbContext.Database.EnsureCreated();
33+
CreateSampleData(dbContext);
3434

3535
app.UseRouting();
3636
app.UseJsonApi();
3737
app.UseEndpoints(endpoints => endpoints.MapControllers());
3838
}
3939

40-
private static void CreateSampleData(SampleDbContext context)
40+
private static void CreateSampleData(SampleDbContext dbContext)
4141
{
4242
// Note: The generate-examples.ps1 script (to create example requests in documentation) depends on these.
4343

44-
context.Books.AddRange(new Book
44+
dbContext.Books.AddRange(new Book
4545
{
4646
Title = "Frankenstein",
4747
PublishYear = 1818,
@@ -67,7 +67,7 @@ private static void CreateSampleData(SampleDbContext context)
6767
}
6868
});
6969

70-
context.SaveChanges();
70+
dbContext.SaveChanges();
7171
}
7272
}
7373
}

src/Examples/MultiDbContextExample/Repositories/DbContextARepository.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ namespace MultiDbContextExample.Repositories
1313
public sealed class DbContextARepository<TResource> : EntityFrameworkCoreRepository<TResource>
1414
where TResource : class, IIdentifiable<int>
1515
{
16-
public DbContextARepository(ITargetedFields targetedFields, DbContextResolver<DbContextA> contextResolver, IResourceGraph resourceGraph,
16+
public DbContextARepository(ITargetedFields targetedFields, DbContextResolver<DbContextA> dbContextResolver, IResourceGraph resourceGraph,
1717
IResourceFactory resourceFactory, IEnumerable<IQueryConstraintProvider> constraintProviders, ILoggerFactory loggerFactory,
1818
IResourceDefinitionAccessor resourceDefinitionAccessor)
19-
: base(targetedFields, contextResolver, resourceGraph, resourceFactory, constraintProviders, loggerFactory, resourceDefinitionAccessor)
19+
: base(targetedFields, dbContextResolver, resourceGraph, resourceFactory, constraintProviders, loggerFactory, resourceDefinitionAccessor)
2020
{
2121
}
2222
}

src/Examples/MultiDbContextExample/Repositories/DbContextBRepository.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ namespace MultiDbContextExample.Repositories
1313
public sealed class DbContextBRepository<TResource> : EntityFrameworkCoreRepository<TResource>
1414
where TResource : class, IIdentifiable<int>
1515
{
16-
public DbContextBRepository(ITargetedFields targetedFields, DbContextResolver<DbContextB> contextResolver, IResourceGraph resourceGraph,
16+
public DbContextBRepository(ITargetedFields targetedFields, DbContextResolver<DbContextB> dbContextResolver, IResourceGraph resourceGraph,
1717
IResourceFactory resourceFactory, IEnumerable<IQueryConstraintProvider> constraintProviders, ILoggerFactory loggerFactory,
1818
IResourceDefinitionAccessor resourceDefinitionAccessor)
19-
: base(targetedFields, contextResolver, resourceGraph, resourceFactory, constraintProviders, loggerFactory, resourceDefinitionAccessor)
19+
: base(targetedFields, dbContextResolver, resourceGraph, resourceFactory, constraintProviders, loggerFactory, resourceDefinitionAccessor)
2020
{
2121
}
2222
}

src/Examples/NoEntityFrameworkExample/Startup.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public void ConfigureServices(IServiceCollection services)
3434

3535
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
3636
[UsedImplicitly]
37-
public void Configure(IApplicationBuilder app, AppDbContext context)
37+
public void Configure(IApplicationBuilder app, AppDbContext dbContext)
3838
{
39-
context.Database.EnsureCreated();
39+
dbContext.Database.EnsureCreated();
4040

4141
app.UseRouting();
4242
app.UseJsonApi();

src/JsonApiDotNetCore/AtomicOperations/LocalIdValidator.cs

+8-10
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ private void ValidateOperation(OperationContainer operation)
5959
{
6060
if (operation.Request.WriteOperation == WriteOperationKind.CreateResource)
6161
{
62-
DeclareLocalId(operation.Resource);
62+
DeclareLocalId(operation.Resource, operation.Request.PrimaryResourceType);
6363
}
6464
else
6565
{
@@ -73,34 +73,32 @@ private void ValidateOperation(OperationContainer operation)
7373

7474
if (operation.Request.WriteOperation == WriteOperationKind.CreateResource)
7575
{
76-
AssignLocalId(operation);
76+
AssignLocalId(operation, operation.Request.PrimaryResourceType);
7777
}
7878
}
7979

80-
private void DeclareLocalId(IIdentifiable resource)
80+
private void DeclareLocalId(IIdentifiable resource, ResourceType resourceType)
8181
{
8282
if (resource.LocalId != null)
8383
{
84-
ResourceContext resourceContext = _resourceGraph.GetResourceContext(resource.GetType());
85-
_localIdTracker.Declare(resource.LocalId, resourceContext.PublicName);
84+
_localIdTracker.Declare(resource.LocalId, resourceType.PublicName);
8685
}
8786
}
8887

89-
private void AssignLocalId(OperationContainer operation)
88+
private void AssignLocalId(OperationContainer operation, ResourceType resourceType)
9089
{
9190
if (operation.Resource.LocalId != null)
9291
{
93-
ResourceContext resourceContext = _resourceGraph.GetResourceContext(operation.Resource.GetType());
94-
_localIdTracker.Assign(operation.Resource.LocalId, resourceContext.PublicName, "placeholder");
92+
_localIdTracker.Assign(operation.Resource.LocalId, resourceType.PublicName, "placeholder");
9593
}
9694
}
9795

9896
private void AssertLocalIdIsAssigned(IIdentifiable resource)
9997
{
10098
if (resource.LocalId != null)
10199
{
102-
ResourceContext resourceContext = _resourceGraph.GetResourceContext(resource.GetType());
103-
_localIdTracker.GetValue(resource.LocalId, resourceContext.PublicName);
100+
ResourceType resourceType = _resourceGraph.GetResourceType(resource.GetType());
101+
_localIdTracker.GetValue(resource.LocalId, resourceType.PublicName);
104102
}
105103
}
106104
}

src/JsonApiDotNetCore/AtomicOperations/OperationProcessorAccessor.cs

+3-6
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,12 @@ namespace JsonApiDotNetCore.AtomicOperations
1414
[PublicAPI]
1515
public class OperationProcessorAccessor : IOperationProcessorAccessor
1616
{
17-
private readonly IResourceGraph _resourceGraph;
1817
private readonly IServiceProvider _serviceProvider;
1918

20-
public OperationProcessorAccessor(IResourceGraph resourceGraph, IServiceProvider serviceProvider)
19+
public OperationProcessorAccessor(IServiceProvider serviceProvider)
2120
{
22-
ArgumentGuard.NotNull(resourceGraph, nameof(resourceGraph));
2321
ArgumentGuard.NotNull(serviceProvider, nameof(serviceProvider));
2422

25-
_resourceGraph = resourceGraph;
2623
_serviceProvider = serviceProvider;
2724
}
2825

@@ -38,9 +35,9 @@ public Task<OperationContainer> ProcessAsync(OperationContainer operation, Cance
3835
protected virtual IOperationProcessor ResolveProcessor(OperationContainer operation)
3936
{
4037
Type processorInterface = GetProcessorInterface(operation.Request.WriteOperation.GetValueOrDefault());
41-
ResourceContext resourceContext = _resourceGraph.GetResourceContext(operation.Resource.GetType());
38+
ResourceType resourceType = operation.Request.PrimaryResourceType;
4239

43-
Type processorType = processorInterface.MakeGenericType(resourceContext.ResourceType, resourceContext.IdentityType);
40+
Type processorType = processorInterface.MakeGenericType(resourceType.ClrType, resourceType.IdentityClrType);
4441
return (IOperationProcessor)_serviceProvider.GetRequiredService(processorType);
4542
}
4643

0 commit comments

Comments
 (0)