Skip to content

Commit d254ac9

Browse files
author
Bart Koelman
committed
Sealed types and reduced dependencies
1 parent 2322ac8 commit d254ac9

File tree

7 files changed

+27
-30
lines changed

7 files changed

+27
-30
lines changed

src/JsonApiDotNetCore/Middleware/JsonApiInputFormatter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ public async Task<InputFormatterResult> ReadAsync(InputFormatterContext context)
2222
ArgumentGuard.NotNull(context, nameof(context));
2323

2424
var reader = context.HttpContext.RequestServices.GetRequiredService<IJsonApiReader>();
25-
return await reader.ReadAsync(context.HttpContext.Request);
25+
26+
object model = await reader.ReadAsync(context.HttpContext.Request);
27+
28+
return model == null ? await InputFormatterResult.NoValueAsync() : await InputFormatterResult.SuccessAsync(model);
2629
}
2730
}
2831
}

src/JsonApiDotNetCore/Middleware/JsonApiOutputFormatter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public async Task WriteAsync(OutputFormatterWriteContext context)
2222
ArgumentGuard.NotNull(context, nameof(context));
2323

2424
var writer = context.HttpContext.RequestServices.GetRequiredService<IJsonApiWriter>();
25-
await writer.WriteAsync(context);
25+
await writer.WriteAsync(context.Object, context.HttpContext);
2626
}
2727
}
2828
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
using System.Threading.Tasks;
22
using JetBrains.Annotations;
33
using Microsoft.AspNetCore.Http;
4-
using Microsoft.AspNetCore.Mvc.Formatters;
54

65
namespace JsonApiDotNetCore.Serialization
76
{
87
/// <summary>
9-
/// Deserializes the incoming JSON request body and converts it to models, which are passed to controller actions by ASP.NET Core on `FromBody`
8+
/// Deserializes the incoming JSON:API request body and converts it to models, which are passed to controller actions by ASP.NET Core on `FromBody`
109
/// parameters.
1110
/// </summary>
1211
[PublicAPI]
@@ -15,6 +14,6 @@ public interface IJsonApiReader
1514
/// <summary>
1615
/// Reads an object from the request body.
1716
/// </summary>
18-
Task<InputFormatterResult> ReadAsync(HttpRequest httpRequest);
17+
Task<object> ReadAsync(HttpRequest httpRequest);
1918
}
2019
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
using System.Threading.Tasks;
22
using JetBrains.Annotations;
3-
using Microsoft.AspNetCore.Mvc.Formatters;
3+
using Microsoft.AspNetCore.Http;
44

55
namespace JsonApiDotNetCore.Serialization
66
{
77
/// <summary>
8-
/// Serializes models into the outgoing JSON response body.
8+
/// Serializes ASP.NET models into the outgoing JSON:API response body.
99
/// </summary>
1010
[PublicAPI]
1111
public interface IJsonApiWriter
1212
{
13-
Task WriteAsync(OutputFormatterWriteContext context);
13+
/// <summary>
14+
/// Writes an object to the response body.
15+
/// </summary>
16+
Task WriteAsync(object model, HttpContext httpContext);
1417
}
1518
}

src/JsonApiDotNetCore/Serialization/JsonApiReader.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@
1212
using JsonApiDotNetCore.Serialization.RequestAdapters;
1313
using Microsoft.AspNetCore.Http;
1414
using Microsoft.AspNetCore.Http.Extensions;
15-
using Microsoft.AspNetCore.Mvc.Formatters;
1615
using Microsoft.Extensions.Logging;
1716

1817
namespace JsonApiDotNetCore.Serialization
1918
{
2019
/// <inheritdoc />
21-
[PublicAPI]
22-
public class JsonApiReader : IJsonApiReader
20+
public sealed class JsonApiReader : IJsonApiReader
2321
{
2422
private readonly IJsonApiOptions _options;
2523
private readonly IDocumentAdapter _documentAdapter;
@@ -37,14 +35,12 @@ public JsonApiReader(IJsonApiOptions options, IDocumentAdapter documentAdapter,
3735
}
3836

3937
/// <inheritdoc />
40-
public async Task<InputFormatterResult> ReadAsync(HttpRequest httpRequest)
38+
public async Task<object> ReadAsync(HttpRequest httpRequest)
4139
{
4240
ArgumentGuard.NotNull(httpRequest, nameof(httpRequest));
4341

4442
string requestBody = await GetRequestBodyAsync(httpRequest);
45-
object model = GetModel(requestBody);
46-
47-
return model == null ? await InputFormatterResult.NoValueAsync() : await InputFormatterResult.SuccessAsync(model);
43+
return GetModel(requestBody);
4844
}
4945

5046
private async Task<string> GetRequestBodyAsync(HttpRequest httpRequest)

src/JsonApiDotNetCore/Serialization/JsonApiWriter.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,21 @@
66
using System.Net.Http;
77
using System.Text;
88
using System.Threading.Tasks;
9-
using JetBrains.Annotations;
109
using JsonApiDotNetCore.Diagnostics;
1110
using JsonApiDotNetCore.Errors;
1211
using JsonApiDotNetCore.Middleware;
1312
using JsonApiDotNetCore.Serialization.Objects;
1413
using Microsoft.AspNetCore.Http;
1514
using Microsoft.AspNetCore.Http.Extensions;
1615
using Microsoft.AspNetCore.Mvc;
17-
using Microsoft.AspNetCore.Mvc.Formatters;
16+
using Microsoft.AspNetCore.WebUtilities;
1817
using Microsoft.Extensions.Logging;
1918
using Microsoft.Net.Http.Headers;
2019

2120
namespace JsonApiDotNetCore.Serialization
2221
{
23-
/// <summary>
24-
/// Formats the response data used (see https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-3.0). It was intended to
25-
/// have as little dependencies as possible in formatting layer for greater extensibility.
26-
/// </summary>
27-
[PublicAPI]
28-
public class JsonApiWriter : IJsonApiWriter
22+
/// <inheritdoc />
23+
public sealed class JsonApiWriter : IJsonApiWriter
2924
{
3025
private readonly IJsonApiSerializer _serializer;
3126
private readonly IExceptionHandler _exceptionHandler;
@@ -45,21 +40,22 @@ public JsonApiWriter(IJsonApiSerializer serializer, IExceptionHandler exceptionH
4540
_traceWriter = new TraceLogWriter<JsonApiWriter>(loggerFactory);
4641
}
4742

48-
public async Task WriteAsync(OutputFormatterWriteContext context)
43+
/// <inheritdoc />
44+
public async Task WriteAsync(object model, HttpContext httpContext)
4945
{
50-
ArgumentGuard.NotNull(context, nameof(context));
46+
ArgumentGuard.NotNull(httpContext, nameof(httpContext));
5147

5248
using IDisposable _ = CodeTimingSessionManager.Current.Measure("Write response body");
5349

54-
HttpRequest request = context.HttpContext.Request;
55-
HttpResponse response = context.HttpContext.Response;
50+
HttpRequest request = httpContext.Request;
51+
HttpResponse response = httpContext.Response;
5652

57-
await using TextWriter writer = context.WriterFactory(response.Body, Encoding.UTF8);
53+
await using TextWriter writer = new HttpResponseStreamWriter(response.Body, Encoding.UTF8);
5854
string responseContent;
5955

6056
try
6157
{
62-
responseContent = SerializeResponse(context.Object, (HttpStatusCode)response.StatusCode);
58+
responseContent = SerializeResponse(model, (HttpStatusCode)response.StatusCode);
6359
}
6460
#pragma warning disable AV1210 // Catch a specific exception instead of Exception, SystemException or ApplicationException
6561
catch (Exception exception)

test/TestBuildingBlocks/IntegrationTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace TestBuildingBlocks
1010
{
1111
/// <summary>
12-
/// A base class for tests that conveniently enables to execute HTTP requests against json:api endpoints.
12+
/// A base class for tests that conveniently enables to execute HTTP requests against JSON:API endpoints.
1313
/// </summary>
1414
public abstract class IntegrationTest
1515
{

0 commit comments

Comments
 (0)