Skip to content

Commit ffe3549

Browse files
committed
Fix ensure that node id serializer registration has no order requirements (#8216)
1 parent 78201c1 commit ffe3549

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
@@ -41,18 +41,31 @@ public static IRequestExecutorBuilder AddDefaultNodeIdSerializer(
4141
throw new ArgumentNullException(nameof(builder));
4242
}
4343

44-
if (!builder.Services.Any(t =>
45-
t.ServiceType == typeof(INodeIdValueSerializer)
46-
&& t.ImplementationType == typeof(StringNodeIdValueSerializer)))
44+
if (!builder.Services.IsImplementationTypeRegistered<StringNodeIdValueSerializer>())
4745
{
4846
builder.Services.AddSingleton<INodeIdValueSerializer, StringNodeIdValueSerializer>();
4947
builder.Services.AddSingleton<INodeIdValueSerializer, Int16NodeIdValueSerializer>();
5048
builder.Services.AddSingleton<INodeIdValueSerializer, Int32NodeIdValueSerializer>();
5149
builder.Services.AddSingleton<INodeIdValueSerializer, Int64NodeIdValueSerializer>();
52-
builder.Services.AddSingleton<INodeIdValueSerializer>(new GuidNodeIdValueSerializer(compress: outputNewIdFormat));
5350
builder.Services.AddSingleton<INodeIdValueSerializer, DecimalNodeIdValueSerializer>();
5451
builder.Services.AddSingleton<INodeIdValueSerializer, SingleNodeIdValueSerializer>();
5552
builder.Services.AddSingleton<INodeIdValueSerializer, DoubleNodeIdValueSerializer>();
53+
builder.Services.AddSingleton<INodeIdValueSerializer>(new GuidNodeIdValueSerializer(compress: outputNewIdFormat));
54+
}
55+
else
56+
{
57+
// if serializers are already registered we need to replace the
58+
// default guid serializer with the new one in order to make sure
59+
// that we have the right settings configured for it.
60+
var serviceRegistration = builder.Services.FirstOrDefault(
61+
t => t.ServiceType == typeof(INodeIdValueSerializer)
62+
&& t.ImplementationType == typeof(GuidNodeIdValueSerializer));
63+
if (serviceRegistration is not null)
64+
{
65+
builder.Services.Remove(serviceRegistration);
66+
builder.Services.AddSingleton<INodeIdValueSerializer>(
67+
new GuidNodeIdValueSerializer(compress: outputNewIdFormat));
68+
}
5669
}
5770

5871
builder.Services.RemoveService<INodeIdSerializer>();
@@ -110,18 +123,14 @@ public static IRequestExecutorBuilder AddDefaultNodeIdSerializer(
110123
/// <param name="builder">
111124
/// The request executor builder.
112125
/// </param>
113-
/// <param name="maxIdLength">
114-
/// The maximum allowed length of a node id.
115-
/// </param>
116126
/// <returns>
117127
/// Returns the request executor builder.
118128
/// </returns>
119129
/// <exception cref="ArgumentNullException">
120130
/// <paramref name="builder"/> is <see langword="null"/>.
121131
/// </exception>
122132
public static IRequestExecutorBuilder AddLegacyNodeIdSerializer(
123-
this IRequestExecutorBuilder builder,
124-
int maxIdLength = 1024)
133+
this IRequestExecutorBuilder builder)
125134
{
126135
if (builder == null)
127136
{

0 commit comments

Comments
 (0)