Skip to content

Commit 86e11d4

Browse files
committed
feat: #500
1 parent 0b1a40f commit 86e11d4

File tree

11 files changed

+56
-7
lines changed

11 files changed

+56
-7
lines changed

src/Examples/GettingStarted/ResourceDefinitionExample/ModelDefinition.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
using System.Collections.Generic;
2+
using JsonApiDotNetCore.Internal;
23
using JsonApiDotNetCore.Models;
34

45
namespace GettingStarted.ResourceDefinitionExample
56
{
67
public class ModelDefinition : ResourceDefinition<Model>
78
{
9+
public ModelDefinition(IResourceGraph graph) : base(graph)
10+
{
11+
}
12+
813
// this allows POST / PATCH requests to set the value of a
914
// property, but we don't include this value in the response
1015
// this might be used if the incoming value gets hashed or

src/Examples/JsonApiDotNetCoreExample/Resources/ArticleResource.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ namespace JsonApiDotNetCoreExample.Resources
1212
{
1313
public class ArticleResource : ResourceDefinition<Article>
1414
{
15+
public ArticleResource(IResourceGraph graph) : base(graph) { }
16+
1517
public override IEnumerable<Article> OnReturn(HashSet<Article> entities, ResourcePipeline pipeline)
1618
{
1719
if (pipeline == ResourcePipeline.ReadSingle && entities.Single().Name == "Classified")

src/Examples/JsonApiDotNetCoreExample/Resources/PassportResource.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ namespace JsonApiDotNetCoreExample.Resources
1010
{
1111
public class PassportResource : ResourceDefinition<Passport>
1212
{
13+
public PassportResource(IResourceGraph graph) : base(graph)
14+
{
15+
}
16+
1317
public override void BeforeRead(ResourcePipeline pipeline, bool nestedHook = false, string stringId = null)
1418
{
1519
if (pipeline == ResourcePipeline.ReadSingle && nestedHook)

src/Examples/JsonApiDotNetCoreExample/Resources/PersonResource.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ namespace JsonApiDotNetCoreExample.Resources
1010
{
1111
public class PersonResource : ResourceDefinition<Person>
1212
{
13+
public PersonResource(IResourceGraph graph) : base(graph)
14+
{
15+
}
16+
1317
public override IEnumerable<string> BeforeUpdateRelationship(HashSet<string> ids, IAffectedRelationships<Person> resourcesByRelationship, ResourcePipeline pipeline)
1418
{
1519
BeforeImplicitUpdateRelationship(resourcesByRelationship, pipeline);

src/Examples/JsonApiDotNetCoreExample/Resources/TagResource.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@
33
using JsonApiDotNetCore.Models;
44
using JsonApiDotNetCore.Hooks;
55
using JsonApiDotNetCoreExample.Models;
6+
using JsonApiDotNetCore.Internal;
67

78
namespace JsonApiDotNetCoreExample.Resources
89
{
910
public class TagResource : ResourceDefinition<Tag>
1011
{
12+
public TagResource(IResourceGraph graph) : base(graph)
13+
{
14+
}
15+
1116
public override IEnumerable<Tag> OnReturn(HashSet<Tag> entities, ResourcePipeline pipeline)
1217
{
1318
return entities.Where(t => t.Name != "This should be not be included");

src/Examples/JsonApiDotNetCoreExample/Resources/TodoResource.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ namespace JsonApiDotNetCoreExample.Resources
1010
{
1111
public class TodoResource : ResourceDefinition<TodoItem>
1212
{
13+
public TodoResource(IResourceGraph graph) : base(graph)
14+
{
15+
}
16+
1317
public override void BeforeRead(ResourcePipeline pipeline, bool isIncluded = false, string stringId = null)
1418
{
1519
if (stringId == "1337")

src/Examples/JsonApiDotNetCoreExample/Resources/UserResource.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@
33
using JsonApiDotNetCore.Models;
44
using JsonApiDotNetCoreExample.Models;
55
using JsonApiDotNetCore.Internal.Query;
6+
using JsonApiDotNetCore.Internal;
67

78
namespace JsonApiDotNetCoreExample.Resources
89
{
910
public class UserResource : ResourceDefinition<User>
1011
{
12+
public UserResource(IResourceGraph graph) : base(graph)
13+
{
14+
}
15+
1116
protected override List<AttrAttribute> OutputAttrs()
1217
=> Remove(user => user.Password);
1318

src/JsonApiDotNetCore/Models/ResourceDefinition.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,15 @@ public interface IResourceDefinition
2525
/// <typeparam name="T">The resource type</typeparam>
2626
public class ResourceDefinition<T> : IResourceDefinition, IResourceHookContainer<T> where T : class, IIdentifiable
2727
{
28-
private readonly IResourceGraph _graph;
2928
private readonly ContextEntity _contextEntity;
3029
internal readonly bool _instanceAttrsAreSpecified;
3130

3231
private bool _requestCachedAttrsHaveBeenLoaded = false;
3332
private List<AttrAttribute> _requestCachedAttrs;
3433

35-
public ResourceDefinition()
34+
public ResourceDefinition(IResourceGraph graph)
3635
{
37-
_graph = ResourceGraph.Instance;
38-
_contextEntity = ResourceGraph.Instance.GetContextEntity(typeof(T));
36+
_contextEntity = graph.GetContextEntity(typeof(T));
3937
_instanceAttrsAreSpecified = InstanceOutputAttrsAreSpecified();
4038
}
4139

@@ -214,9 +212,9 @@ public class QueryFilters : Dictionary<string, Func<IQueryable<T>, FilterQuery,
214212
/// };
215213
/// </code>
216214
/// </example>
217-
protected virtual PropertySortOrder GetDefaultSortOrder() => null;
215+
public virtual PropertySortOrder GetDefaultSortOrder() => null;
218216

219-
internal List<(AttrAttribute, SortDirection)> DefaultSort()
217+
public List<(AttrAttribute, SortDirection)> DefaultSort()
220218
{
221219
var defaultSortOrder = GetDefaultSortOrder();
222220
if (defaultSortOrder != null && defaultSortOrder.Count > 0)

test/UnitTests/Builders/DocumentBuilder_Tests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ public void Build_Will_Use_Resource_If_Defined_For_Multiple_Documents()
300300
var scopedServiceProvider = new TestScopedServiceProvider(
301301
new ServiceCollection()
302302
.AddScoped<ResourceDefinition<User>, UserResource>()
303+
.AddSingleton(resourceGraph)
303304
.BuildServiceProvider());
304305

305306
var documentBuilder = new DocumentBuilder(_jsonApiContextMock.Object, scopedServiceProvider: scopedServiceProvider);
@@ -323,6 +324,7 @@ public void Build_Will_Use_Resource_If_Defined_For_Single_Document()
323324
var scopedServiceProvider = new TestScopedServiceProvider(
324325
new ServiceCollection()
325326
.AddScoped<ResourceDefinition<User>, UserResource>()
327+
.AddSingleton(resourceGraph)
326328
.BuildServiceProvider());
327329

328330
var documentBuilder = new DocumentBuilder(_jsonApiContextMock.Object, scopedServiceProvider: scopedServiceProvider);
@@ -345,6 +347,7 @@ public void Build_Will_Use_Instance_Specific_Resource_If_Defined_For_Multiple_Do
345347
var scopedServiceProvider = new TestScopedServiceProvider(
346348
new ServiceCollection()
347349
.AddScoped<ResourceDefinition<User>, InstanceSpecificUserResource>()
350+
.AddSingleton(resourceGraph)
348351
.BuildServiceProvider());
349352

350353
var documentBuilder = new DocumentBuilder(_jsonApiContextMock.Object, scopedServiceProvider: scopedServiceProvider);
@@ -368,6 +371,7 @@ public void Build_Will_Use_Instance_Specific_Resource_If_Defined_For_Single_Docu
368371
var scopedServiceProvider = new TestScopedServiceProvider(
369372
new ServiceCollection()
370373
.AddScoped<ResourceDefinition<User>, InstanceSpecificUserResource>()
374+
.AddSingleton(resourceGraph)
371375
.BuildServiceProvider());
372376

373377
var documentBuilder = new DocumentBuilder(_jsonApiContextMock.Object, scopedServiceProvider: scopedServiceProvider);
@@ -386,12 +390,20 @@ public class User : Identifiable
386390

387391
public class InstanceSpecificUserResource : ResourceDefinition<User>
388392
{
393+
public InstanceSpecificUserResource(IResourceGraph graph) : base(graph)
394+
{
395+
}
396+
389397
protected override List<AttrAttribute> OutputAttrs(User instance)
390398
=> Remove(user => user.Password);
391399
}
392400

393401
public class UserResource : ResourceDefinition<User>
394402
{
403+
public UserResource(IResourceGraph graph) : base(graph)
404+
{
405+
}
406+
395407
protected override List<AttrAttribute> OutputAttrs()
396408
=> Remove(user => user.Password);
397409
}

test/UnitTests/Models/ResourceDefinitionTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public class RequestFilteredResource : ResourceDefinition<Model>
109109

110110
// this constructor will be resolved from the container
111111
// that means you can take on any dependency that is also defined in the container
112-
public RequestFilteredResource(bool isAdmin)
112+
public RequestFilteredResource(bool isAdmin) : base (new ResourceGraphBuilder().AddResource<Model>().Build())
113113
{
114114
_isAdmin = isAdmin;
115115
}
@@ -133,6 +133,10 @@ protected override PropertySortOrder GetDefaultSortOrder()
133133

134134
public class InstanceFilteredResource : ResourceDefinition<Model>
135135
{
136+
public InstanceFilteredResource() : base(new ResourceGraphBuilder().AddResource<Model>().Build())
137+
{
138+
}
139+
136140
// Called once per resource instance
137141
protected override List<AttrAttribute> OutputAttrs(Model model)
138142
=> model.AlwaysExcluded == "Admin"

0 commit comments

Comments
 (0)