Skip to content

Commit 01f131e

Browse files
committed
Make more types injectable
1 parent f7f8f8b commit 01f131e

8 files changed

+64
-47
lines changed

src/JsonApiDotNetCore.OpenApi/ConfigureMvcOptions.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,28 @@ namespace JsonApiDotNetCore.OpenApi;
77

88
internal sealed class ConfigureMvcOptions : IConfigureOptions<MvcOptions>
99
{
10-
private readonly IControllerResourceMapping _controllerResourceMapping;
1110
private readonly IJsonApiRoutingConvention _jsonApiRoutingConvention;
11+
private readonly OpenApiEndpointConvention _openApiEndpointConvention;
12+
private readonly JsonApiRequestFormatMetadataProvider _jsonApiRequestFormatMetadataProvider;
1213

13-
public ConfigureMvcOptions(IControllerResourceMapping controllerResourceMapping, IJsonApiRoutingConvention jsonApiRoutingConvention)
14+
public ConfigureMvcOptions(IJsonApiRoutingConvention jsonApiRoutingConvention, OpenApiEndpointConvention openApiEndpointConvention,
15+
JsonApiRequestFormatMetadataProvider jsonApiRequestFormatMetadataProvider)
1416
{
15-
ArgumentGuard.NotNull(controllerResourceMapping);
1617
ArgumentGuard.NotNull(jsonApiRoutingConvention);
18+
ArgumentGuard.NotNull(openApiEndpointConvention);
19+
ArgumentGuard.NotNull(jsonApiRequestFormatMetadataProvider);
1720

18-
_controllerResourceMapping = controllerResourceMapping;
1921
_jsonApiRoutingConvention = jsonApiRoutingConvention;
22+
_openApiEndpointConvention = openApiEndpointConvention;
23+
_jsonApiRequestFormatMetadataProvider = jsonApiRequestFormatMetadataProvider;
2024
}
2125

2226
public void Configure(MvcOptions options)
2327
{
2428
AddSwashbuckleCliCompatibility(options);
25-
AddOpenApiEndpointConvention(options);
29+
30+
options.InputFormatters.Add(_jsonApiRequestFormatMetadataProvider);
31+
options.Conventions.Add(_openApiEndpointConvention);
2632
}
2733

2834
private void AddSwashbuckleCliCompatibility(MvcOptions options)
@@ -33,10 +39,4 @@ private void AddSwashbuckleCliCompatibility(MvcOptions options)
3339
options.Conventions.Insert(0, _jsonApiRoutingConvention);
3440
}
3541
}
36-
37-
private void AddOpenApiEndpointConvention(MvcOptions options)
38-
{
39-
var convention = new OpenApiEndpointConvention(_controllerResourceMapping);
40-
options.Conventions.Add(convention);
41-
}
4242
}

src/JsonApiDotNetCore.OpenApi/JsonApiActionDescriptorCollectionProvider.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@ internal sealed class JsonApiActionDescriptorCollectionProvider : IActionDescrip
2222

2323
public ActionDescriptorCollection ActionDescriptors => GetActionDescriptors();
2424

25-
public JsonApiActionDescriptorCollectionProvider(IControllerResourceMapping controllerResourceMapping, IActionDescriptorCollectionProvider defaultProvider,
26-
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider)
25+
public JsonApiActionDescriptorCollectionProvider(IActionDescriptorCollectionProvider defaultProvider,
26+
JsonApiEndpointMetadataProvider jsonApiEndpointMetadataProvider)
2727
{
28-
ArgumentGuard.NotNull(controllerResourceMapping);
2928
ArgumentGuard.NotNull(defaultProvider);
30-
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
29+
ArgumentGuard.NotNull(jsonApiEndpointMetadataProvider);
3130

3231
_defaultProvider = defaultProvider;
33-
_jsonApiEndpointMetadataProvider = new JsonApiEndpointMetadataProvider(controllerResourceMapping, resourceFieldValidationMetadataProvider);
32+
_jsonApiEndpointMetadataProvider = jsonApiEndpointMetadataProvider;
3433
}
3534

3635
private ActionDescriptorCollection GetActionDescriptors()
@@ -167,32 +166,32 @@ private static void UpdateBodyParameterDescriptor(ActionDescriptor endpoint, Typ
167166

168167
private static ActionDescriptor Clone(ActionDescriptor descriptor)
169168
{
170-
var clonedDescriptor = (ActionDescriptor)descriptor.MemberwiseClone();
169+
var clone = (ActionDescriptor)descriptor.MemberwiseClone();
171170

172-
clonedDescriptor.AttributeRouteInfo = (AttributeRouteInfo)descriptor.AttributeRouteInfo!.MemberwiseClone();
171+
clone.AttributeRouteInfo = (AttributeRouteInfo)descriptor.AttributeRouteInfo!.MemberwiseClone();
173172

174-
clonedDescriptor.FilterDescriptors = new List<FilterDescriptor>();
173+
clone.FilterDescriptors = new List<FilterDescriptor>();
175174

176175
foreach (FilterDescriptor filter in descriptor.FilterDescriptors)
177176
{
178-
clonedDescriptor.FilterDescriptors.Add(Clone(filter));
177+
clone.FilterDescriptors.Add(Clone(filter));
179178
}
180179

181-
clonedDescriptor.Parameters = new List<ParameterDescriptor>();
180+
clone.Parameters = new List<ParameterDescriptor>();
182181

183182
foreach (ParameterDescriptor parameter in descriptor.Parameters)
184183
{
185-
clonedDescriptor.Parameters.Add((ParameterDescriptor)parameter.MemberwiseClone());
184+
clone.Parameters.Add((ParameterDescriptor)parameter.MemberwiseClone());
186185
}
187186

188-
return clonedDescriptor;
187+
return clone;
189188
}
190189

191190
private static FilterDescriptor Clone(FilterDescriptor descriptor)
192191
{
193-
var clonedFilter = (IFilterMetadata)descriptor.Filter.MemberwiseClone();
192+
var clone = (IFilterMetadata)descriptor.Filter.MemberwiseClone();
194193

195-
return new FilterDescriptor(clonedFilter, descriptor.Scope)
194+
return new FilterDescriptor(clone, descriptor.Scope)
196195
{
197196
Order = descriptor.Order
198197
};

src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/JsonApiEndpointMetadataProvider.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,20 @@ namespace JsonApiDotNetCore.OpenApi.JsonApiMetadata;
1212
/// </summary>
1313
internal sealed class JsonApiEndpointMetadataProvider
1414
{
15+
private readonly EndpointResolver _endpointResolver;
1516
private readonly IControllerResourceMapping _controllerResourceMapping;
16-
private readonly EndpointResolver _endpointResolver = new();
1717
private readonly NonPrimaryDocumentTypeFactory _nonPrimaryDocumentTypeFactory;
1818

19-
public JsonApiEndpointMetadataProvider(IControllerResourceMapping controllerResourceMapping,
20-
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider)
19+
public JsonApiEndpointMetadataProvider(EndpointResolver endpointResolver, IControllerResourceMapping controllerResourceMapping,
20+
NonPrimaryDocumentTypeFactory nonPrimaryDocumentTypeFactory)
2121
{
22+
ArgumentGuard.NotNull(endpointResolver);
2223
ArgumentGuard.NotNull(controllerResourceMapping);
23-
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
24+
ArgumentGuard.NotNull(nonPrimaryDocumentTypeFactory);
2425

25-
_nonPrimaryDocumentTypeFactory = new NonPrimaryDocumentTypeFactory(resourceFieldValidationMetadataProvider);
26+
_endpointResolver = endpointResolver;
2627
_controllerResourceMapping = controllerResourceMapping;
28+
_nonPrimaryDocumentTypeFactory = nonPrimaryDocumentTypeFactory;
2729
}
2830

2931
public JsonApiEndpointMetadataContainer Get(MethodInfo controllerAction)

src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/RelationshipTypeFactory.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ namespace JsonApiDotNetCore.OpenApi.JsonApiMetadata;
55

66
internal sealed class RelationshipTypeFactory
77
{
8-
private readonly ResourceFieldValidationMetadataProvider _resourceFieldValidationMetadataProvider;
98
private readonly NonPrimaryDocumentTypeFactory _nonPrimaryDocumentTypeFactory;
9+
private readonly ResourceFieldValidationMetadataProvider _resourceFieldValidationMetadataProvider;
1010

11-
public RelationshipTypeFactory(ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider)
11+
public RelationshipTypeFactory(NonPrimaryDocumentTypeFactory nonPrimaryDocumentTypeFactory,
12+
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider)
1213
{
14+
ArgumentGuard.NotNull(nonPrimaryDocumentTypeFactory);
1315
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
1416

15-
_nonPrimaryDocumentTypeFactory = new NonPrimaryDocumentTypeFactory(resourceFieldValidationMetadataProvider);
17+
_nonPrimaryDocumentTypeFactory = nonPrimaryDocumentTypeFactory;
1618
_resourceFieldValidationMetadataProvider = resourceFieldValidationMetadataProvider;
1719
}
1820

src/JsonApiDotNetCore.OpenApi/OpenApiEndpointConvention.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ namespace JsonApiDotNetCore.OpenApi;
1616
internal sealed class OpenApiEndpointConvention : IActionModelConvention
1717
{
1818
private readonly IControllerResourceMapping _controllerResourceMapping;
19-
private readonly EndpointResolver _endpointResolver = new();
19+
private readonly EndpointResolver _endpointResolver;
2020

21-
public OpenApiEndpointConvention(IControllerResourceMapping controllerResourceMapping)
21+
public OpenApiEndpointConvention(IControllerResourceMapping controllerResourceMapping, EndpointResolver endpointResolver)
2222
{
2323
ArgumentGuard.NotNull(controllerResourceMapping);
24+
ArgumentGuard.NotNull(endpointResolver);
2425

2526
_controllerResourceMapping = controllerResourceMapping;
27+
_endpointResolver = endpointResolver;
2628
}
2729

2830
public void Apply(ActionModel action)

src/JsonApiDotNetCore.OpenApi/ServiceCollectionExtensions.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using JsonApiDotNetCore.OpenApi.JsonApiMetadata;
12
using JsonApiDotNetCore.OpenApi.SwaggerComponents;
23
using Microsoft.AspNetCore.Mvc;
34
using Microsoft.AspNetCore.Mvc.ApiExplorer;
@@ -23,8 +24,6 @@ public static void AddOpenApi(this IServiceCollection services, IMvcCoreBuilder
2324
AddCustomSwaggerComponents(services);
2425
AddSwaggerGenerator(services);
2526

26-
services.AddTransient<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
27-
2827
if (setupSwaggerGenAction != null)
2928
{
3029
services.Configure(setupSwaggerGenAction);
@@ -33,8 +32,13 @@ public static void AddOpenApi(this IServiceCollection services, IMvcCoreBuilder
3332

3433
private static void AddCustomApiExplorer(IServiceCollection services, IMvcCoreBuilder mvcBuilder)
3534
{
35+
services.TryAddSingleton<OpenApiEndpointConvention>();
36+
services.TryAddSingleton<JsonApiRequestFormatMetadataProvider>();
37+
services.TryAddSingleton<EndpointResolver>();
38+
services.TryAddSingleton<JsonApiEndpointMetadataProvider>();
39+
services.TryAddSingleton<JsonApiActionDescriptorCollectionProvider>();
40+
services.TryAddSingleton<NonPrimaryDocumentTypeFactory>();
3641
services.TryAddSingleton<ResourceFieldValidationMetadataProvider>();
37-
services.AddSingleton<JsonApiActionDescriptorCollectionProvider>();
3842

3943
services.TryAddSingleton<IApiDescriptionGroupCollectionProvider>(serviceProvider =>
4044
{
@@ -46,7 +50,7 @@ private static void AddCustomApiExplorer(IServiceCollection services, IMvcCoreBu
4650

4751
mvcBuilder.AddApiExplorer();
4852

49-
mvcBuilder.AddMvcOptions(options => options.InputFormatters.Add(new JsonApiRequestFormatMetadataProvider()));
53+
services.AddSingleton<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
5054
}
5155

5256
private static void AddCustomSwaggerComponents(IServiceCollection services)
@@ -62,6 +66,8 @@ private static void AddSwaggerGenerator(IServiceCollection services)
6266
{
6367
AddSchemaGenerators(services);
6468

69+
services.TryAddSingleton<RelationshipTypeFactory>();
70+
6571
services.AddSwaggerGen();
6672
services.AddSingleton<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerGenOptions>();
6773
}

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/ResourceDataSchemaGenerator.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using JsonApiDotNetCore.Configuration;
2+
using JsonApiDotNetCore.OpenApi.JsonApiMetadata;
23
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
34
using Microsoft.OpenApi.Models;
45
using Swashbuckle.AspNetCore.SwaggerGen;
@@ -24,18 +25,21 @@ internal sealed class ResourceDataSchemaGenerator
2425
private readonly IResourceGraph _resourceGraph;
2526
private readonly IJsonApiOptions _options;
2627
private readonly ResourceFieldValidationMetadataProvider _resourceFieldValidationMetadataProvider;
28+
private readonly RelationshipTypeFactory _relationshipTypeFactory;
2729
private readonly ResourceDocumentationReader _resourceDocumentationReader;
2830

2931
public ResourceDataSchemaGenerator(SchemaGenerator defaultSchemaGenerator, ResourceTypeSchemaGenerator resourceTypeSchemaGenerator,
3032
ResourceIdentifierSchemaGenerator resourceIdentifierSchemaGenerator, IResourceGraph resourceGraph, IJsonApiOptions options,
31-
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider, ResourceDocumentationReader resourceDocumentationReader)
33+
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider, RelationshipTypeFactory relationshipTypeFactory,
34+
ResourceDocumentationReader resourceDocumentationReader)
3235
{
3336
ArgumentGuard.NotNull(defaultSchemaGenerator);
3437
ArgumentGuard.NotNull(resourceTypeSchemaGenerator);
3538
ArgumentGuard.NotNull(resourceIdentifierSchemaGenerator);
3639
ArgumentGuard.NotNull(resourceGraph);
3740
ArgumentGuard.NotNull(options);
3841
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
42+
ArgumentGuard.NotNull(relationshipTypeFactory);
3943
ArgumentGuard.NotNull(resourceDocumentationReader);
4044

4145
_defaultSchemaGenerator = defaultSchemaGenerator;
@@ -44,7 +48,7 @@ public ResourceDataSchemaGenerator(SchemaGenerator defaultSchemaGenerator, Resou
4448
_resourceGraph = resourceGraph;
4549
_options = options;
4650
_resourceFieldValidationMetadataProvider = resourceFieldValidationMetadataProvider;
47-
51+
_relationshipTypeFactory = relationshipTypeFactory;
4852
_resourceDocumentationReader = resourceDocumentationReader;
4953
}
5054

@@ -65,7 +69,7 @@ public OpenApiSchema GenerateSchema(Type resourceDataConstructedType, SchemaRepo
6569
var resourceTypeInfo = ResourceTypeInfo.Create(resourceDataConstructedType, _resourceGraph);
6670

6771
var fieldSchemaBuilder = new ResourceFieldSchemaBuilder(_defaultSchemaGenerator, _resourceIdentifierSchemaGenerator,
68-
_resourceFieldValidationMetadataProvider, resourceTypeInfo);
72+
_resourceFieldValidationMetadataProvider, _relationshipTypeFactory, resourceTypeInfo);
6973

7074
OpenApiSchema effectiveFullSchemaForResourceData =
7175
fullSchemaForResourceData.AllOf.Count == 0 ? fullSchemaForResourceData : fullSchemaForResourceData.AllOf[1];

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/ResourceFieldSchemaBuilder.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,29 @@ internal sealed class ResourceFieldSchemaBuilder
3535
private readonly ResourceIdentifierSchemaGenerator _resourceIdentifierSchemaGenerator;
3636
private readonly ResourceTypeInfo _resourceTypeInfo;
3737
private readonly ResourceFieldValidationMetadataProvider _resourceFieldValidationMetadataProvider;
38-
private readonly SchemaRepository _resourceSchemaRepository = new();
3938
private readonly RelationshipTypeFactory _relationshipTypeFactory;
39+
40+
private readonly SchemaRepository _resourceSchemaRepository = new();
41+
private readonly ResourceDocumentationReader _resourceDocumentationReader = new();
4042
private readonly IDictionary<string, OpenApiSchema> _schemasForResourceFields;
41-
private readonly ResourceDocumentationReader _resourceDocumentationReader;
4243

4344
public ResourceFieldSchemaBuilder(SchemaGenerator defaultSchemaGenerator, ResourceIdentifierSchemaGenerator resourceIdentifierSchemaGenerator,
44-
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider, ResourceTypeInfo resourceTypeInfo)
45+
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider, RelationshipTypeFactory relationshipTypeFactory,
46+
ResourceTypeInfo resourceTypeInfo)
4547
{
4648
ArgumentGuard.NotNull(defaultSchemaGenerator);
4749
ArgumentGuard.NotNull(resourceIdentifierSchemaGenerator);
4850
ArgumentGuard.NotNull(resourceTypeInfo);
4951
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
52+
ArgumentGuard.NotNull(relationshipTypeFactory);
5053

5154
_defaultSchemaGenerator = defaultSchemaGenerator;
5255
_resourceIdentifierSchemaGenerator = resourceIdentifierSchemaGenerator;
5356
_resourceTypeInfo = resourceTypeInfo;
5457
_resourceFieldValidationMetadataProvider = resourceFieldValidationMetadataProvider;
58+
_relationshipTypeFactory = relationshipTypeFactory;
5559

56-
_relationshipTypeFactory = new RelationshipTypeFactory(resourceFieldValidationMetadataProvider);
5760
_schemasForResourceFields = GetFieldSchemas();
58-
_resourceDocumentationReader = new ResourceDocumentationReader();
5961
}
6062

6163
private IDictionary<string, OpenApiSchema> GetFieldSchemas()

0 commit comments

Comments
 (0)