Skip to content

Commit

Permalink
Don't resolve service parameter types from JsonSerializer (#48930)
Browse files Browse the repository at this point in the history
  • Loading branch information
captainsafia authored Jun 21, 2023
1 parent c7d58cd commit 3926560
Show file tree
Hide file tree
Showing 18 changed files with 57 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string pa
""";
public static string ResolveJsonBodyOrServiceMethod => """
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonTypeInfo<T> jsonTypeInfo, IServiceProviderIsService? serviceProviderIsService = null)
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null)
{
if (serviceProviderIsService is not null)
{
Expand All @@ -239,6 +239,7 @@ private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string pa
return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService<T>()));
}
}
var jsonTypeInfo = (JsonTypeInfo<T>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T));
return (httpContext, isOptional) => TryResolveBodyAsync<T>(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true);
}
""";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter,
}
codeWriter.Write($@"var {parameter.SymbolName}_JsonBodyOrServiceResolver = ");
var shortParameterTypeName = parameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, {parameter.SymbolName}_JsonTypeInfo, serviceProviderIsService);");
codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, jsonOptions, serviceProviderIsService);");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ internal static void EmitJsonPreparation(this Endpoint endpoint, CodeWriter code

static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter)
{
if (parameter.Source != EndpointParameterSource.JsonBody && parameter.Source != EndpointParameterSource.JsonBodyOrService && parameter.Source != EndpointParameterSource.JsonBodyOrQuery)
if (parameter.Source != EndpointParameterSource.JsonBody)
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ internal static void EmitJsonBodyOrQueryParameterPreparationString(this Endpoint
var shortParameterTypeName = endpointParameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
var assigningCode = $"await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<{endpointParameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(httpContext, logOrThrowExceptionHelper, {(endpointParameter.IsOptional ? "true" : "false")}, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(endpointParameter.SymbolName, true)}, {endpointParameter.SymbolName}_JsonTypeInfo)";
var resolveBodyResult = $"{endpointParameter.SymbolName}_resolveBodyResult";
codeWriter.WriteLine($"var {endpointParameter.SymbolName}_JsonTypeInfo = (JsonTypeInfo<{endpointParameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>)jsonOptions.SerializerOptions.GetTypeInfo(typeof({endpointParameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}));");
codeWriter.WriteLine($"var {resolveBodyResult} = {assigningCode};");
codeWriter.WriteLine($"{endpointParameter.EmitHandlerArgument()} = {resolveBodyResult}.Item2!;");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));

if (options.EndpointBuilder.FilterFactories.Count > 0)
{
Expand Down Expand Up @@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down Expand Up @@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));

if (options.EndpointBuilder.FilterFactories.Count > 0)
{
Expand Down Expand Up @@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down Expand Up @@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));

if (options.EndpointBuilder.FilterFactories.Count > 0)
{
Expand Down Expand Up @@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down Expand Up @@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));

if (options.EndpointBuilder.FilterFactories.Count > 0)
{
Expand Down Expand Up @@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down Expand Up @@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
}
else
{
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
p_local = p_resolveBodyResult.Item2!;
if (!p_resolveBodyResult.Item1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,9 @@ namespace Microsoft.AspNetCore.Http.Generated
var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
var todo_JsonTypeInfo = (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
var svc_JsonTypeInfo = (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.TestService));
var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(logOrThrowExceptionHelper, "Todo", "todo", todo_JsonTypeInfo, serviceProviderIsService);
var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(logOrThrowExceptionHelper, "TestService", "svc", svc_JsonTypeInfo, serviceProviderIsService);
var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService);
var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService);

if (options.EndpointBuilder.FilterFactories.Count > 0)
{
Expand Down Expand Up @@ -339,7 +337,7 @@ namespace Microsoft.AspNetCore.Http.Generated

return (true, bodyValue);
}
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonTypeInfo<T> jsonTypeInfo, IServiceProviderIsService? serviceProviderIsService = null)
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null)
{
if (serviceProviderIsService is not null)
{
Expand All @@ -348,6 +346,7 @@ namespace Microsoft.AspNetCore.Http.Generated
return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService<T>()));
}
}
var jsonTypeInfo = (JsonTypeInfo<T>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T));
return (httpContext, isOptional) => TryResolveBodyAsync<T>(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,8 @@ namespace Microsoft.AspNetCore.Http.Generated
var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
var x_JsonTypeInfo = (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter));
var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", x_JsonTypeInfo, serviceProviderIsService);
var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService);

if (options.EndpointBuilder.FilterFactories.Count > 0)
{
Expand Down Expand Up @@ -317,7 +316,7 @@ namespace Microsoft.AspNetCore.Http.Generated

return (true, bodyValue);
}
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonTypeInfo<T> jsonTypeInfo, IServiceProviderIsService? serviceProviderIsService = null)
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null)
{
if (serviceProviderIsService is not null)
{
Expand All @@ -326,6 +325,7 @@ namespace Microsoft.AspNetCore.Http.Generated
return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService<T>()));
}
}
var jsonTypeInfo = (JsonTypeInfo<T>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T));
return (httpContext, isOptional) => TryResolveBodyAsync<T>(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true);
}
private static void PopulateMetadataForEndpoint<T>(MethodInfo method, EndpointBuilder builder)
Expand Down
Loading

0 comments on commit 3926560

Please sign in to comment.