Skip to content

Commit bc5cca2

Browse files
authored
Fix ensure that node id serializer registration has no order requirements (#8216)
1 parent d0f3629 commit bc5cca2

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.IdSerializer.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,31 @@ public static IRequestExecutorBuilder AddDefaultNodeIdSerializer(
3838
{
3939
ArgumentNullException.ThrowIfNull(builder);
4040

41-
if (!builder.Services.Any(t =>
42-
t.ServiceType == typeof(INodeIdValueSerializer)
43-
&& t.ImplementationType == typeof(StringNodeIdValueSerializer)))
41+
if (!builder.Services.IsImplementationTypeRegistered<StringNodeIdValueSerializer>())
4442
{
4543
builder.Services.AddSingleton<INodeIdValueSerializer, StringNodeIdValueSerializer>();
4644
builder.Services.AddSingleton<INodeIdValueSerializer, Int16NodeIdValueSerializer>();
4745
builder.Services.AddSingleton<INodeIdValueSerializer, Int32NodeIdValueSerializer>();
4846
builder.Services.AddSingleton<INodeIdValueSerializer, Int64NodeIdValueSerializer>();
49-
builder.Services.AddSingleton<INodeIdValueSerializer>(new GuidNodeIdValueSerializer(compress: outputNewIdFormat));
5047
builder.Services.AddSingleton<INodeIdValueSerializer, DecimalNodeIdValueSerializer>();
5148
builder.Services.AddSingleton<INodeIdValueSerializer, SingleNodeIdValueSerializer>();
5249
builder.Services.AddSingleton<INodeIdValueSerializer, DoubleNodeIdValueSerializer>();
50+
builder.Services.AddSingleton<INodeIdValueSerializer>(new GuidNodeIdValueSerializer(compress: outputNewIdFormat));
51+
}
52+
else
53+
{
54+
// if serializers are already registered we need to replace the
55+
// default guid serializer with the new one in order to make sure
56+
// that we have the right settings configured for it.
57+
var serviceRegistration = builder.Services.FirstOrDefault(
58+
t => t.ServiceType == typeof(INodeIdValueSerializer)
59+
&& t.ImplementationType == typeof(GuidNodeIdValueSerializer));
60+
if (serviceRegistration is not null)
61+
{
62+
builder.Services.Remove(serviceRegistration);
63+
builder.Services.AddSingleton<INodeIdValueSerializer>(
64+
new GuidNodeIdValueSerializer(compress: outputNewIdFormat));
65+
}
5366
}
5467

5568
builder.Services.RemoveService<INodeIdSerializer>();
@@ -120,18 +133,14 @@ public static IRequestExecutorBuilder AddDefaultNodeIdSerializer(
120133
/// <param name="builder">
121134
/// The request executor builder.
122135
/// </param>
123-
/// <param name="maxIdLength">
124-
/// The maximum allowed length of a node id.
125-
/// </param>
126136
/// <returns>
127137
/// Returns the request executor builder.
128138
/// </returns>
129139
/// <exception cref="ArgumentNullException">
130140
/// <paramref name="builder"/> is <see langword="null"/>.
131141
/// </exception>
132142
public static IRequestExecutorBuilder AddLegacyNodeIdSerializer(
133-
this IRequestExecutorBuilder builder,
134-
int maxIdLength = 1024)
143+
this IRequestExecutorBuilder builder)
135144
{
136145
ArgumentNullException.ThrowIfNull(builder);
137146

0 commit comments

Comments
 (0)