Skip to content

Commit 0a8cc4b

Browse files
committed
8.0.0 beta 3
1 parent 3f9339a commit 0a8cc4b

File tree

10 files changed

+338
-513
lines changed

10 files changed

+338
-513
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Text.Json;
3+
using Microsoft.Extensions.Options;
4+
5+
namespace MicroElements.Metadata.AspNetCore;
6+
7+
/// <summary>
8+
/// JsonSerializerOptions for Metadata serialization. Value wrapper that can be used in netstandard.
9+
/// </summary>
10+
public class AspNetJsonSerializerOptions
11+
{
12+
/// <summary>
13+
/// Gets the <see cref="System.Text.Json.JsonSerializerOptions"/> from AspNet host.
14+
/// </summary>
15+
public JsonSerializerOptions JsonSerializerOptions { get; set; }
16+
}
17+
18+
internal sealed class ConfigureAspNetJsonSerializerOptions(IServiceProvider serviceProvider)
19+
: IConfigureNamedOptions<AspNetJsonSerializerOptions>
20+
{
21+
/// <inheritdoc />
22+
public void Configure(string? name, AspNetJsonSerializerOptions options)
23+
{
24+
JsonSerializerOptions jsonOptions = serviceProvider.GetJsonSerializerOptionsOrDefault();
25+
options.JsonSerializerOptions = jsonOptions;
26+
}
27+
28+
/// <inheritdoc />
29+
public void Configure(AspNetJsonSerializerOptions options) => Configure(null, options);
30+
}

src/MicroElements.Metadata.AspNetCore/AspNetCore/DependencyInjectionExtensions.cs

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Microsoft.AspNetCore.Mvc;
1111
using Microsoft.Extensions.DependencyInjection;
1212
using Microsoft.Extensions.DependencyInjection.Extensions;
13+
using Microsoft.Extensions.Options;
1314
using Swashbuckle.AspNetCore.SwaggerGen;
1415

1516
namespace MicroElements.Metadata.AspNetCore
@@ -40,15 +41,12 @@ public static IServiceCollection AddMetadata(
4041
configureMetadataJson ??= options => { };
4142
services.Configure<MetadataJsonSerializationOptions>(configureMetadataJson);
4243

43-
// Allows to serialize property containers
44-
// NOTE: Not the same as AspNet JsonSerializerOptions. Use AspNetJsonSerializerOptions wrapper
45-
services.Configure<JsonSerializerOptions>(options => options.ConfigureJsonForPropertyContainers(configureMetadataJson));
46-
47-
// Configures serialization for AspNetCore
44+
// Configures System.Text.Json serialization for AspNetCore and MinimalApi
4845
services.ConfigureJsonOptionsForAspNetCore(options => options.ConfigureJsonForPropertyContainers(configureMetadataJson));
46+
services.ConfigureJsonOptionsForMinimalApi(options => options.ConfigureJsonForPropertyContainers(configureMetadataJson));
4947

5048
// Register wrapper for AspNetCore json options.
51-
services.AddTransient<AspNetJsonSerializerOptions>(provider => new AspNetJsonSerializerOptions(provider.GetJsonSerializerOptionsOrDefault()));
49+
services.ConfigureOptions<ConfigureAspNetJsonSerializerOptions>();
5250

5351
// Allows to use property containers in swagger
5452
services.ConfigureSwaggerForPropertyContainers(configureSwaggerOptions);
@@ -66,6 +64,23 @@ public static IServiceCollection AddMetadata(
6664
return services;
6765
}
6866

67+
public static void ConfigureJsonOptionsForAspNetCore(this IServiceCollection services, Action<JsonSerializerOptions> configureJson)
68+
{
69+
services.Configure<JsonOptions>(options => configureJson(options.JsonSerializerOptions));
70+
}
71+
72+
public static void ConfigureJsonOptionsForMinimalApi(this IServiceCollection services, Action<JsonSerializerOptions> configureJson)
73+
{
74+
services.ConfigureHttpJsonOptions(options => configureJson(options.SerializerOptions));
75+
}
76+
77+
public static JsonSerializerOptions GetJsonSerializerOptionsOrDefault(this IServiceProvider serviceProvider)
78+
{
79+
return serviceProvider.GetService<IOptions<JsonOptions>>()?.Value.JsonSerializerOptions
80+
?? serviceProvider.GetService<IOptions<Microsoft.AspNetCore.Http.Json.JsonOptions>>()?.Value.SerializerOptions
81+
?? new JsonSerializerOptions();
82+
}
83+
6984
internal static IServiceCollection Decorate<TService>(
7085
this IServiceCollection services,
7186
Func<TService, TService> decorate)
@@ -108,24 +123,4 @@ ServiceDescriptor CreateServiceDescriptor(Func<IServiceProvider, TService> func)
108123
return services;
109124
}
110125
}
111-
112-
/// <summary>
113-
/// AspNetCore MVC JsonOptions. Value wrapper that can be used in netstandard.
114-
/// </summary>
115-
public class AspNetJsonSerializerOptions
116-
{
117-
/// <summary>
118-
/// Initializes a new instance of the <see cref="AspNetJsonSerializerOptions"/> class.
119-
/// </summary>
120-
/// <param name="value"><see cref="JsonSerializerOptions"/> from AspNet host.</param>
121-
public AspNetJsonSerializerOptions(JsonSerializerOptions value)
122-
{
123-
Value = value;
124-
}
125-
126-
/// <summary>
127-
/// Gets the <see cref="JsonSerializerOptions"/> from AspNet host.
128-
/// </summary>
129-
public JsonSerializerOptions Value { get; }
130-
}
131126
}

src/MicroElements.Metadata.AspNetCore/AspNetCore/ReflectionDependencyInjectionExtensions.cs

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

src/MicroElements.Metadata.AspNetCore/Swashbuckle/MetadataSerializerBehavior.cs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,35 @@
66
using MicroElements.Reflection.TypeExtensions;
77
using Swashbuckle.AspNetCore.SwaggerGen;
88

9-
namespace MicroElements.Metadata.Swashbuckle
9+
namespace MicroElements.Metadata.Swashbuckle;
10+
11+
/// <summary>
12+
/// Configures serialization for <see cref="IPropertyContainer"/> as for collections.
13+
/// Also <see cref="IPropertyValue"/> replaces for <see cref="PropertyValueContract"/> because swagger generates schemas for many unnecessary system types.
14+
/// </summary>
15+
public class MetadataSerializerBehavior : ISerializerDataContractResolver
1016
{
17+
private readonly ISerializerDataContractResolver _dataContractResolver;
18+
1119
/// <summary>
12-
/// Configures serialization for <see cref="IPropertyContainer"/> as for collections.
13-
/// Also <see cref="IPropertyValue"/> replaces for <see cref="PropertyValueContract"/> because swagger generates schemas for many unnecessary system types.
20+
/// Initializes a new instance of the <see cref="MetadataSerializerBehavior"/> class.
1421
/// </summary>
15-
public class MetadataSerializerBehavior : ISerializerDataContractResolver
22+
/// <param name="dataContractResolver">Base service.</param>
23+
public MetadataSerializerBehavior(ISerializerDataContractResolver dataContractResolver)
1624
{
17-
private readonly ISerializerDataContractResolver _dataContractResolver;
25+
_dataContractResolver = dataContractResolver;
26+
}
1827

19-
/// <summary>
20-
/// Initializes a new instance of the <see cref="MetadataSerializerBehavior"/> class.
21-
/// </summary>
22-
/// <param name="dataContractResolver">Base service.</param>
23-
public MetadataSerializerBehavior(ISerializerDataContractResolver dataContractResolver)
28+
/// <inheritdoc />
29+
public DataContract GetDataContractForType(Type type)
30+
{
31+
if (type.IsAssignableTo<IPropertyContainer>())
2432
{
25-
_dataContractResolver = dataContractResolver;
33+
// Array is used for schema inlining.
34+
// If IPropertyContainer is not collection then schema will be generated as a reference but we need to make it dependent on PropertySet.
35+
return DataContract.ForArray(type, typeof(PropertyValueContract));
2636
}
2737

28-
/// <inheritdoc />
29-
public DataContract GetDataContractForType(Type type)
30-
{
31-
if (type.IsAssignableTo<IPropertyContainer>())
32-
{
33-
// Array is used for schema inlining.
34-
// If IPropertyContainer is not collection then schema will be generated as a reference but we need to make it dependent on PropertySet.
35-
return DataContract.ForArray(type, typeof(PropertyValueContract));
36-
}
37-
38-
return _dataContractResolver.GetDataContractForType(type);
39-
}
38+
return _dataContractResolver.GetDataContractForType(type);
4039
}
41-
}
40+
}

0 commit comments

Comments
 (0)