Skip to content

Commit 44c83ae

Browse files
author
Chris Santero
committed
Move payload builder configuration into separate object
1 parent e9e22dd commit 44c83ae

8 files changed

Lines changed: 160 additions & 124 deletions

File tree

JSONAPI.EntityFramework.Tests.TestWebApp/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ private static HttpConfiguration GetWebApiConfiguration()
6969

7070
// Configure JSON API
7171
new JsonApiConfiguration(modelManager)
72-
.UseEntityFramework()
72+
.UsingDefaultQueryablePayloadBuilder(c => c.EnumerateQueriesAsynchronously())
7373
.Apply(httpConfig);
7474

7575

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using JSONAPI.Core;
2+
using JSONAPI.EntityFramework.ActionFilters;
3+
4+
namespace JSONAPI.EntityFramework
5+
{
6+
/// <summary>
7+
/// Extension Methods for JSONAPI.Core.DefaultQueryablePayloadBuilderConfiguration
8+
/// </summary>
9+
public static class DefaultQueryablePayloadBuilderConfigurationExtensions
10+
{
11+
/// <summary>
12+
/// Add Entity Framework specific handling to the configuration
13+
/// </summary>
14+
/// <param name="config">The configuration object to modify</param>
15+
/// <returns>The same configuration object that was passed in</returns>
16+
public static DefaultQueryablePayloadBuilderConfiguration EnumerateQueriesAsynchronously(this DefaultQueryablePayloadBuilderConfiguration config)
17+
{
18+
config.EnumerateQueriesWith(new AsynchronousEnumerationTransformer());
19+
20+
return config;
21+
}
22+
}
23+
}

JSONAPI.EntityFramework/JSONAPI.EntityFramework.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
<Compile Include="EntityFrameworkMaterializer.cs" />
7676
<Compile Include="EntityFrameworkMaterializer_Util.cs" />
7777
<Compile Include="Http\ApiController.cs" />
78-
<Compile Include="JsonApiConfigurationExtensions.cs" />
78+
<Compile Include="DefaultQueryablePayloadBuilderConfigurationExtensions.cs" />
7979
<Compile Include="PluralizationService.cs" />
8080
<Compile Include="Properties\AssemblyInfo.cs" />
8181
</ItemGroup>

JSONAPI.EntityFramework/JsonApiConfigurationExtensions.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

JSONAPI.TodoMVC.API/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private static HttpConfiguration GetWebApiConfiguration()
2626

2727
// Configure JSON API
2828
new JsonApiConfiguration(modelManager)
29-
.UseEntityFramework()
29+
.UsingDefaultQueryablePayloadBuilder(c => c.EnumerateQueriesAsynchronously())
3030
.Apply(httpConfig);
3131

3232
// Web API routes
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
using JSONAPI.ActionFilters;
2+
using JSONAPI.Payload;
3+
4+
namespace JSONAPI.Core
5+
{
6+
/// <summary>
7+
/// Provides a fluent configuration system for DefaultQueryablePayloadBuilder
8+
/// </summary>
9+
public sealed class DefaultQueryablePayloadBuilderConfiguration
10+
{
11+
private bool _enableFiltering;
12+
private bool _enableSorting;
13+
private bool _enablePagination;
14+
private IQueryableFilteringTransformer _filteringTransformer;
15+
private IQueryableSortingTransformer _sortingTransformer;
16+
private IQueryablePaginationTransformer _paginationTransformer;
17+
private IQueryableEnumerationTransformer _enumerationTransformer;
18+
19+
internal DefaultQueryablePayloadBuilderConfiguration()
20+
{
21+
_enableFiltering = true;
22+
_enableSorting = true;
23+
_enablePagination = true;
24+
}
25+
26+
/// <summary>
27+
/// Disables filtering of IQueryables in GET methods
28+
/// </summary>
29+
/// <returns>The same configuration object the method was called on.</returns>
30+
public DefaultQueryablePayloadBuilderConfiguration DisableFiltering()
31+
{
32+
_enableFiltering = false;
33+
return this;
34+
}
35+
36+
/// <summary>
37+
/// Disables sorting of IQueryables in GET methods
38+
/// </summary>
39+
/// <returns>The same configuration object the method was called on.</returns>
40+
public DefaultQueryablePayloadBuilderConfiguration DisableSorting()
41+
{
42+
_enableSorting = false;
43+
return this;
44+
}
45+
46+
/// <summary>
47+
/// Disables pagination of IQueryables in GET methods
48+
/// </summary>
49+
/// <returns>The same configuration object the method was called on.</returns>
50+
public DefaultQueryablePayloadBuilderConfiguration DisablePagination()
51+
{
52+
_enablePagination = false;
53+
return this;
54+
}
55+
56+
/// <summary>
57+
/// Specifies a filtering transformer to use for filtering IQueryable response payloads.
58+
/// </summary>
59+
/// <param name="filteringTransformer">The filtering transformer.</param>
60+
/// <returns>The same configuration object the method was called on.</returns>
61+
public DefaultQueryablePayloadBuilderConfiguration FilterWith(IQueryableFilteringTransformer filteringTransformer)
62+
{
63+
_filteringTransformer = filteringTransformer;
64+
return this;
65+
}
66+
67+
/// <summary>
68+
/// Specifies a sorting transformer to use for sorting IQueryable response payloads.
69+
/// </summary>
70+
/// <param name="sortingTransformer">The sorting transformer.</param>
71+
/// <returns>The same configuration object the method was called on.</returns>
72+
public DefaultQueryablePayloadBuilderConfiguration SortWith(IQueryableSortingTransformer sortingTransformer)
73+
{
74+
_sortingTransformer = sortingTransformer;
75+
return this;
76+
}
77+
78+
/// <summary>
79+
/// Specifies a pagination transformer to use for paging IQueryable response payloads.
80+
/// </summary>
81+
/// <param name="paginationTransformer">The pagination transformer.</param>
82+
/// <returns>The same configuration object the method was called on.</returns>
83+
public DefaultQueryablePayloadBuilderConfiguration PageWith(IQueryablePaginationTransformer paginationTransformer)
84+
{
85+
_paginationTransformer = paginationTransformer;
86+
return this;
87+
}
88+
89+
/// <summary>
90+
/// Specifies an enumeration transformer to use for enumerating IQueryable response payloads.
91+
/// </summary>
92+
/// <param name="enumerationTransformer">The enumeration transformer.</param>
93+
/// <returns>The same configuration object the method was called on.</returns>
94+
public DefaultQueryablePayloadBuilderConfiguration EnumerateQueriesWith(IQueryableEnumerationTransformer enumerationTransformer)
95+
{
96+
_enumerationTransformer = enumerationTransformer;
97+
return this;
98+
}
99+
100+
internal DefaultQueryablePayloadBuilder GetBuilder(IModelManager modelManager)
101+
{
102+
IQueryableFilteringTransformer filteringTransformer = null;
103+
if (_enableFiltering)
104+
filteringTransformer = _filteringTransformer ?? new DefaultFilteringTransformer(modelManager);
105+
106+
IQueryableSortingTransformer sortingTransformer = null;
107+
if (_enableSorting)
108+
sortingTransformer = _sortingTransformer ?? new DefaultSortingTransformer(modelManager);
109+
110+
IQueryablePaginationTransformer paginationTransformer = null;
111+
if (_enablePagination)
112+
paginationTransformer =
113+
_paginationTransformer ?? new DefaultPaginationTransformer("page.number", "page.size");
114+
115+
IQueryableEnumerationTransformer enumerationTransformer =
116+
_enumerationTransformer ?? new SynchronousEnumerationTransformer();
117+
118+
return new DefaultQueryablePayloadBuilder(enumerationTransformer, filteringTransformer, sortingTransformer, paginationTransformer);
119+
}
120+
}
121+
}

JSONAPI/Core/JsonApiConfiguration.cs

Lines changed: 12 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,8 @@ namespace JSONAPI.Core
1414
/// </summary>
1515
public class JsonApiConfiguration
1616
{
17-
private bool _enableFiltering;
18-
private bool _enableSorting;
19-
private bool _enablePagination;
20-
private IQueryableFilteringTransformer _filteringTransformer;
21-
private IQueryableSortingTransformer _sortingTransformer;
22-
private IQueryablePaginationTransformer _paginationTransformer;
23-
private IQueryableEnumerationTransformer _enumerationTransformer;
2417
private readonly IModelManager _modelManager;
18+
private Func<IQueryablePayloadBuilder> _payloadBuilderFactory;
2519

2620
/// <summary>
2721
/// Creates a new configuration
@@ -30,87 +24,23 @@ public JsonApiConfiguration(IModelManager modelManager)
3024
{
3125
if (modelManager == null) throw new Exception("You must provide ");
3226

33-
_enableFiltering = true;
34-
_enableSorting = true;
35-
_enablePagination = true;
36-
_filteringTransformer = null;
37-
_sortingTransformer = null;
38-
_paginationTransformer = null;
39-
_enumerationTransformer = null;
4027
_modelManager = modelManager;
28+
_payloadBuilderFactory = () => new DefaultQueryablePayloadBuilderConfiguration().GetBuilder(modelManager);
4129
}
4230

4331
/// <summary>
44-
/// Disables filtering of IQueryables in GET methods
32+
/// Allows configuring the default queryable payload builder
4533
/// </summary>
34+
/// <param name="configurationAction">Provides access to a fluent DefaultQueryablePayloadBuilderConfiguration object</param>
4635
/// <returns>The same configuration object the method was called on.</returns>
47-
public JsonApiConfiguration DisableFiltering()
36+
public JsonApiConfiguration UsingDefaultQueryablePayloadBuilder(Action<DefaultQueryablePayloadBuilderConfiguration> configurationAction)
4837
{
49-
_enableFiltering = false;
50-
return this;
51-
}
52-
53-
/// <summary>
54-
/// Disables sorting of IQueryables in GET methods
55-
/// </summary>
56-
/// <returns>The same configuration object the method was called on.</returns>
57-
public JsonApiConfiguration DisableSorting()
58-
{
59-
_enableSorting = false;
60-
return this;
61-
}
62-
63-
/// <summary>
64-
/// Disables pagination of IQueryables in GET methods
65-
/// </summary>
66-
/// <returns>The same configuration object the method was called on.</returns>
67-
public JsonApiConfiguration DisablePagination()
68-
{
69-
_enablePagination = false;
70-
return this;
71-
}
72-
73-
/// <summary>
74-
/// Specifies a filtering transformer to use for filtering IQueryable response payloads.
75-
/// </summary>
76-
/// <param name="filteringTransformer">The filtering transformer.</param>
77-
/// <returns>The same configuration object the method was called on.</returns>
78-
public JsonApiConfiguration FilterWith(IQueryableFilteringTransformer filteringTransformer)
79-
{
80-
_filteringTransformer = filteringTransformer;
81-
return this;
82-
}
83-
84-
/// <summary>
85-
/// Specifies a sorting transformer to use for sorting IQueryable response payloads.
86-
/// </summary>
87-
/// <param name="sortingTransformer">The sorting transformer.</param>
88-
/// <returns>The same configuration object the method was called on.</returns>
89-
public JsonApiConfiguration SortWith(IQueryableSortingTransformer sortingTransformer)
90-
{
91-
_sortingTransformer = sortingTransformer;
92-
return this;
93-
}
94-
95-
/// <summary>
96-
/// Specifies a pagination transformer to use for paging IQueryable response payloads.
97-
/// </summary>
98-
/// <param name="paginationTransformer">The pagination transformer.</param>
99-
/// <returns>The same configuration object the method was called on.</returns>
100-
public JsonApiConfiguration PageWith(IQueryablePaginationTransformer paginationTransformer)
101-
{
102-
_paginationTransformer = paginationTransformer;
103-
return this;
104-
}
105-
106-
/// <summary>
107-
/// Specifies an enumeration transformer to use for enumerating IQueryable response payloads.
108-
/// </summary>
109-
/// <param name="enumerationTransformer">The enumeration transformer.</param>
110-
/// <returns>The same configuration object the method was called on.</returns>
111-
public JsonApiConfiguration EnumerateQueriesWith(IQueryableEnumerationTransformer enumerationTransformer)
112-
{
113-
_enumerationTransformer = enumerationTransformer;
38+
_payloadBuilderFactory = () =>
39+
{
40+
var configuration = new DefaultQueryablePayloadBuilderConfiguration();
41+
configurationAction(configuration);
42+
return configuration.GetBuilder(_modelManager);
43+
};
11444
return this;
11545
}
11646

@@ -120,28 +50,12 @@ public JsonApiConfiguration EnumerateQueriesWith(IQueryableEnumerationTransforme
12050
/// <param name="httpConfig">The HttpConfiguration to apply this JsonApiConfiguration to</param>
12151
public void Apply(HttpConfiguration httpConfig)
12252
{
123-
IQueryableFilteringTransformer filteringTransformer = null;
124-
if (_enableFiltering)
125-
filteringTransformer = _filteringTransformer ?? new DefaultFilteringTransformer(_modelManager);
126-
127-
IQueryableSortingTransformer sortingTransformer = null;
128-
if (_enableSorting)
129-
sortingTransformer = _sortingTransformer ?? new DefaultSortingTransformer(_modelManager);
130-
131-
IQueryablePaginationTransformer paginationTransformer = null;
132-
if (_enablePagination)
133-
paginationTransformer =
134-
_paginationTransformer ?? new DefaultPaginationTransformer("page.number", "page.size", null);
135-
136-
IQueryableEnumerationTransformer enumerationTransformer =
137-
_enumerationTransformer ?? new SynchronousEnumerationTransformer();
138-
13953
var formatter = new JsonApiFormatter(_modelManager);
14054

14155
httpConfig.Formatters.Clear();
14256
httpConfig.Formatters.Add(formatter);
14357

144-
var queryablePayloadBuilder = new DefaultQueryablePayloadBuilder(enumerationTransformer, filteringTransformer, sortingTransformer, paginationTransformer);
58+
var queryablePayloadBuilder = _payloadBuilderFactory();
14559
httpConfig.Filters.Add(new JsonApiQueryableAttribute(queryablePayloadBuilder));
14660

14761
httpConfig.Services.Replace(typeof (IHttpControllerSelector),

JSONAPI/JSONAPI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
<Compile Include="Attributes\SerializeAs.cs" />
8282
<Compile Include="Attributes\SerializeStringAsRawJsonAttribute.cs" />
8383
<Compile Include="Attributes\UseAsIdAttribute.cs" />
84+
<Compile Include="Core\DefaultQueryablePayloadBuilderConfiguration.cs" />
8485
<Compile Include="Core\IMetadataManager.cs" />
8586
<Compile Include="Core\IModelManager.cs" />
8687
<Compile Include="Core\IPluralizationService.cs" />

0 commit comments

Comments
 (0)