-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathServiceCollectionExtensions.cs
More file actions
118 lines (110 loc) · 4.23 KB
/
ServiceCollectionExtensions.cs
File metadata and controls
118 lines (110 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System.Text.Json;
using System.Text.Json.Serialization;
using JsonApiToolkit.Filters;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.DependencyInjection;
namespace JsonApiToolkit.Extensions;
/// <summary>
/// Provides extension methods for integrating JsonApiToolkit into the ASP.NET Core dependency injection system.
/// </summary>
/// <remarks>
/// Contains the core setup method for registering and configuring all JsonApiToolkit components
/// in an ASP.NET Core application.
/// </remarks>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Configures all necessary services and options for JsonApiToolkit in an ASP.NET Core application.
/// </summary>
/// <param name="services">The service collection to add JsonApiToolkit services to</param>
/// <returns>The service collection for method chaining</returns>
/// <remarks>
/// This method performs the following configuration steps:
/// <list type="number">
/// <item>
/// <description>Configures JSON serialization options:
/// <list type="bullet">
/// <item>
/// <description>Sets camelCase property naming to comply with JSON:API naming conventions</description>
/// </item>
/// <item>
/// <description>Ignores null values to reduce response size</description>
/// </item>
/// <item>
/// <description>Configures reference handling to prevent circular references</description>
/// </item>
/// </list>
/// </description>
/// </item>
/// <item>
/// <description>Adds support for the JSON:API media type:
/// <list type="bullet">
/// <item>
/// <description>Registers "application/vnd.api+json" as a supported media type for JSON formatters</description>
/// </item>
/// <item>
/// <description>Ensures proper content negotiation for JSON:API responses</description>
/// </item>
/// </list>
/// </description>
/// </item>
/// <item>
/// <description>Registers the JSON:API exception filter:
/// <list type="bullet">
/// <item>
/// <description>Provides standardized error handling for unhandled exceptions</description>
/// </item>
/// <item>
/// <description>Formats errors according to the JSON:API specification</description>
/// </item>
/// </list>
/// </description>
/// </item>
/// </list>
/// Call this method in your Startup.ConfigureServices or Program.cs to fully configure JsonApiToolkit.
/// <para>
/// Example:
/// <code>
/// builder.Services.AddJsonApiToolkit();
/// </code>
/// </para>
/// </remarks>
public static IServiceCollection AddJsonApiToolkit(this IServiceCollection services)
{
services.Configure<JsonOptions>(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.DefaultIgnoreCondition =
JsonIgnoreCondition.WhenWritingNull;
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
services.Configure<MvcOptions>(options =>
{
SystemTextJsonOutputFormatter? jsonOutputFormatter = options
.OutputFormatters.OfType<SystemTextJsonOutputFormatter>()
.FirstOrDefault();
if (
jsonOutputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json")
== false
)
{
jsonOutputFormatter.SupportedMediaTypes.Add("application/vnd.api+json");
}
SystemTextJsonInputFormatter? jsonInputFormatter = options
.InputFormatters.OfType<SystemTextJsonInputFormatter>()
.FirstOrDefault();
if (
jsonInputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json")
== false
)
{
jsonInputFormatter.SupportedMediaTypes.Add("application/vnd.api+json");
}
options.Filters.AddService<JsonApiContentTypeFilter>();
});
services.AddScoped<JsonApiExceptionFilter>();
services.AddScoped<JsonApiContentTypeFilter>();
return services;
}
}