From 982bf33348c447cff7b920c893cdd599df3fc06a Mon Sep 17 00:00:00 2001
From: wuyangfan <1102042793@qq.com>
Date: Sun, 17 May 2026 22:57:06 +0800
Subject: [PATCH] chore: align constant naming and file-scoped namespace
Rename constants to PascalCase, use file-scoped namespace in
ServiceCollectionExtensions, and tighten editorconfig rules.
Fixes #139
---
.editorconfig | 4 +-
.../Extensions/ServiceCollectionExtensions.cs | 125 +++++++++---------
.../Filters/JsonApiContentTypeFilter.cs | 6 +-
JsonApiToolkit/Parsing/JsonApiQueryParser.cs | 4 +-
4 files changed, 70 insertions(+), 69 deletions(-)
diff --git a/.editorconfig b/.editorconfig
index 60b15f5..767f78c 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -49,8 +49,10 @@ csharp_style_expression_bodied_local_functions = true:refactoring
dotnet_style_readonly_field = true:suggestion
dotnet_code_quality_unused_parameters = non_public:suggestion
+csharp_style_namespace_declarations = file_scoped:warning
+
# Naming: PascalCase for constants
-dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = warning
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
diff --git a/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs b/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs
index 38e3141..c237f09 100644
--- a/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs
+++ b/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs
@@ -10,83 +10,82 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
-namespace JsonApiToolkit.Extensions
+namespace JsonApiToolkit.Extensions;
+
+///
+/// Extension methods for registering JsonApiToolkit services.
+///
+public static class ServiceCollectionExtensions
{
///
- /// Extension methods for registering JsonApiToolkit services.
+ /// Registers JsonApiToolkit services with default options.
+ ///
+ public static IServiceCollection AddJsonApiToolkit(this IServiceCollection services) =>
+ AddJsonApiToolkit(services, _ => { });
+
+ ///
+ /// Registers JsonApiToolkit services with custom options configuration.
///
- public static class ServiceCollectionExtensions
+ /// The service collection.
+ /// Action to configure JsonApiOptions.
+ public static IServiceCollection AddJsonApiToolkit(
+ this IServiceCollection services,
+ Action configure
+ )
{
- ///
- /// Registers JsonApiToolkit services with default options.
- ///
- public static IServiceCollection AddJsonApiToolkit(this IServiceCollection services) =>
- AddJsonApiToolkit(services, _ => { });
+ // Register options
+ services.Configure(configure);
+ // Configure JSON serialization options
+ services.Configure(options =>
+ {
+ options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
+ options.JsonSerializerOptions.DefaultIgnoreCondition =
+ JsonIgnoreCondition.WhenWritingNull;
+ options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
+ });
- ///
- /// Registers JsonApiToolkit services with custom options configuration.
- ///
- /// The service collection.
- /// Action to configure JsonApiOptions.
- public static IServiceCollection AddJsonApiToolkit(
- this IServiceCollection services,
- Action configure
- )
+ // Configure MVC formatters and filters
+ services.Configure(options =>
{
- // Register options
- services.Configure(configure);
- // Configure JSON serialization options
- services.Configure(options =>
- {
- options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
- options.JsonSerializerOptions.DefaultIgnoreCondition =
- JsonIgnoreCondition.WhenWritingNull;
- options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
- });
+ SystemTextJsonOutputFormatter? jsonOutputFormatter = options
+ .OutputFormatters.OfType()
+ .FirstOrDefault();
- // Configure MVC formatters and filters
- services.Configure(options =>
+ if (
+ jsonOutputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json")
+ == false
+ )
{
- SystemTextJsonOutputFormatter? jsonOutputFormatter = options
- .OutputFormatters.OfType()
- .FirstOrDefault();
+ jsonOutputFormatter.SupportedMediaTypes.Add("application/vnd.api+json");
+ }
- if (
- jsonOutputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json")
- == false
- )
- {
- jsonOutputFormatter.SupportedMediaTypes.Add("application/vnd.api+json");
- }
+ SystemTextJsonInputFormatter? jsonInputFormatter = options
+ .InputFormatters.OfType()
+ .FirstOrDefault();
- SystemTextJsonInputFormatter? jsonInputFormatter = options
- .InputFormatters.OfType()
- .FirstOrDefault();
-
- if (
- jsonInputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json")
- == false
- )
- {
- jsonInputFormatter.SupportedMediaTypes.Add("application/vnd.api+json");
- }
+ if (
+ jsonInputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json")
+ == false
+ )
+ {
+ jsonInputFormatter.SupportedMediaTypes.Add("application/vnd.api+json");
+ }
- options.Filters.AddService();
- });
+ options.Filters.AddService();
+ });
- // Register filters
- services.AddScoped();
- services.AddScoped();
+ // Register filters
+ services.AddScoped();
+ services.AddScoped();
- // Register query parser service
- services.AddScoped();
+ // Register query parser service
+ services.AddScoped();
- // Register include pattern validator for startup validation
- services.TryAddEnumerable(
- ServiceDescriptor.Transient()
- );
+ // Register include pattern validator for startup validation
+ services.TryAddEnumerable(
+ ServiceDescriptor.Transient()
+ );
- return services;
- }
+ return services;
}
}
diff --git a/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs b/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs
index 0e7afe2..3866cd5 100644
--- a/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs
+++ b/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs
@@ -8,7 +8,7 @@ namespace JsonApiToolkit.Filters;
///
public class JsonApiContentTypeFilter : IActionFilter
{
- private const string s_jsonApiMediaType = "application/vnd.api+json";
+ private const string JsonApiMediaType = "application/vnd.api+json";
///
/// Called before the action executes.
@@ -23,11 +23,11 @@ public void OnActionExecuted(ActionExecutedContext context)
if (context.Result is ObjectResult objectResult)
{
objectResult.ContentTypes.Clear();
- objectResult.ContentTypes.Add(s_jsonApiMediaType);
+ objectResult.ContentTypes.Add(JsonApiMediaType);
}
else if (context.Result is StatusCodeResult)
{
- context.HttpContext.Response.ContentType = s_jsonApiMediaType;
+ context.HttpContext.Response.ContentType = JsonApiMediaType;
}
}
}
diff --git a/JsonApiToolkit/Parsing/JsonApiQueryParser.cs b/JsonApiToolkit/Parsing/JsonApiQueryParser.cs
index d169b41..21351ca 100644
--- a/JsonApiToolkit/Parsing/JsonApiQueryParser.cs
+++ b/JsonApiToolkit/Parsing/JsonApiQueryParser.cs
@@ -13,7 +13,7 @@ namespace JsonApiToolkit.Parsing;
///
public static class JsonApiQueryParser
{
- private const int MIN_PAGE_SIZE = 1;
+ private const int MinPageSize = 1;
///
/// Minimum length for a valid filter key: "filter[x]" = 9 characters.
@@ -97,7 +97,7 @@ public static QueryParameters Parse(
hasPageNumber && int.TryParse(pageNumber, out int num) ? Math.Max(1, num) : 1, // Default to page 1 if not specified or invalid
Size =
hasPageSize && int.TryParse(pageSize, out int size)
- ? Math.Clamp(size, MIN_PAGE_SIZE, options.MaxPageSize)
+ ? Math.Clamp(size, MinPageSize, options.MaxPageSize)
: options.DefaultPageSize, // Use configured defaults
};
}