Skip to content

Commit cc2f3fe

Browse files
Scope IDocumentHashProvider configuration to schema (#8844)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent b70cea1 commit cc2f3fe

19 files changed

+311
-222
lines changed

src/HotChocolate/AspNetCore/benchmarks/k6/performance-data.json

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
2-
"timestamp": "2025-10-23T16:02:23Z",
2+
"timestamp": "2025-10-23T19:09:41Z",
33
"tests": {
44
"single-fetch": {
55
"name": "Single Fetch (50 products, names only)",
66
"response_time": {
7-
"min": 1.447863,
8-
"p50": 2.751327,
9-
"max": 58.155978,
10-
"avg": 3.0016228840274928,
11-
"p90": 4.130812,
12-
"p95": 4.938353,
13-
"p99": 7.987915299999998
7+
"min": 1.311196,
8+
"p50": 1.763142,
9+
"max": 50.855832,
10+
"avg": 1.968737330531039,
11+
"p90": 2.5424552000000005,
12+
"p95": 2.9549014,
13+
"p99": 5.398412600000002
1414
},
1515
"throughput": {
16-
"requests_per_second": 78.71047667816899,
17-
"total_iterations": 7162
16+
"requests_per_second": 78.78513545438359,
17+
"total_iterations": 7168
1818
},
1919
"reliability": {
2020
"error_rate": 0
@@ -23,17 +23,17 @@
2323
"dataloader": {
2424
"name": "DataLoader (50 products with brands)",
2525
"response_time": {
26-
"min": 2.924864,
27-
"p50": 4.8340905,
28-
"max": 24.782141,
29-
"avg": 5.312051972269166,
30-
"p90": 7.203395599999999,
31-
"p95": 8.972791199999993,
32-
"p99": 12.379031920000001
26+
"min": 2.581101,
27+
"p50": 3.39728,
28+
"max": 19.088613,
29+
"avg": 3.776861670740273,
30+
"p90": 5.147565999999999,
31+
"p95": 6.316323699999998,
32+
"p99": 8.866344979999997
3333
},
3434
"throughput": {
35-
"requests_per_second": 78.41421668508127,
36-
"total_iterations": 7135
35+
"requests_per_second": 78.61021441670597,
36+
"total_iterations": 7150
3737
},
3838
"reliability": {
3939
"error_rate": 0

src/HotChocolate/AspNetCore/test/AspNetCore.Tests/PersistedOperationTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ public async Task HotChocolateStyle_Sha1Hash_Success()
7373

7474
var server = CreateStarWarsServer(
7575
configureServices: s => s
76-
.AddSha1DocumentHashProvider(HashFormat.Hex)
7776
.AddGraphQL("StarWars")
77+
.AddSha1DocumentHashProvider(HashFormat.Hex)
7878
.ConfigureSchemaServices(c => c.AddSingleton<IOperationDocumentStorage>(storage))
7979
.UsePersistedOperationPipeline());
8080

@@ -100,8 +100,8 @@ public async Task HotChocolateStyle_Sha256Hash_Success()
100100

101101
var server = CreateStarWarsServer(
102102
configureServices: s => s
103-
.AddSha256DocumentHashProvider(HashFormat.Hex)
104103
.AddGraphQL("StarWars")
104+
.AddSha256DocumentHashProvider(HashFormat.Hex)
105105
.ConfigureSchemaServices(c => c.AddSingleton<IOperationDocumentStorage>(storage))
106106
.UsePersistedOperationPipeline());
107107

@@ -127,8 +127,8 @@ public async Task HotChocolateStyle_Sha256Hash_Query_Empty_String_Success()
127127

128128
var server = CreateStarWarsServer(
129129
configureServices: s => s
130-
.AddSha256DocumentHashProvider(HashFormat.Hex)
131130
.AddGraphQL("StarWars")
131+
.AddSha256DocumentHashProvider(HashFormat.Hex)
132132
.ConfigureSchemaServices(c => c.AddSingleton<IOperationDocumentStorage>(storage))
133133
.UsePersistedOperationPipeline());
134134

@@ -211,8 +211,8 @@ public async Task ApolloStyle_Sha1Hash_Success()
211211

212212
var server = CreateStarWarsServer(
213213
configureServices: s => s
214-
.AddSha1DocumentHashProvider(HashFormat.Hex)
215214
.AddGraphQL("StarWars")
215+
.AddSha1DocumentHashProvider(HashFormat.Hex)
216216
.ConfigureSchemaServices(c => c.AddSingleton<IOperationDocumentStorage>(storage))
217217
.UsePersistedOperationPipeline());
218218

@@ -238,8 +238,8 @@ public async Task ApolloStyle_Sha256Hash_Success()
238238

239239
var server = CreateStarWarsServer(
240240
configureServices: s => s
241-
.AddSha256DocumentHashProvider(HashFormat.Hex)
242241
.AddGraphQL("StarWars")
242+
.AddSha256DocumentHashProvider(HashFormat.Hex)
243243
.ConfigureSchemaServices(c => c.AddSingleton<IOperationDocumentStorage>(storage))
244244
.UsePersistedOperationPipeline());
245245

src/HotChocolate/Core/src/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,6 @@ internal static IServiceCollection TryAddRequestExecutorResolver(
146146
return services;
147147
}
148148

149-
internal static IServiceCollection TryAddDefaultDocumentHashProvider(
150-
this IServiceCollection services)
151-
{
152-
services.TryAddSingleton<IDocumentHashProvider>(
153-
_ => new MD5DocumentHashProvider(HashFormat.Hex));
154-
return services;
155-
}
156-
157149
internal static IServiceCollection TryAddDefaultBatchDispatcher(
158150
this IServiceCollection services,
159151
BatchDispatcherOptions options)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using HotChocolate.Execution.Configuration;
2+
using HotChocolate.Language;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Microsoft.Extensions.DependencyInjection.Extensions;
5+
6+
namespace Microsoft.Extensions.DependencyInjection;
7+
8+
public static partial class RequestExecutorBuilderExtensions
9+
{
10+
public static IRequestExecutorBuilder AddMD5DocumentHashProvider(
11+
this IRequestExecutorBuilder builder,
12+
HashFormat format = HashFormat.Base64)
13+
{
14+
return builder.ConfigureSchemaServices(services =>
15+
{
16+
services.RemoveAll<IDocumentHashProvider>();
17+
services.AddSingleton<IDocumentHashProvider>(new MD5DocumentHashProvider(format));
18+
});
19+
}
20+
21+
public static IRequestExecutorBuilder AddSha1DocumentHashProvider(
22+
this IRequestExecutorBuilder builder,
23+
HashFormat format = HashFormat.Base64)
24+
{
25+
return builder.ConfigureSchemaServices(services =>
26+
{
27+
services.RemoveAll<IDocumentHashProvider>();
28+
services.AddSingleton<IDocumentHashProvider>(new Sha1DocumentHashProvider(format));
29+
});
30+
}
31+
32+
public static IRequestExecutorBuilder AddSha256DocumentHashProvider(
33+
this IRequestExecutorBuilder builder,
34+
HashFormat format = HashFormat.Base64)
35+
{
36+
return builder.ConfigureSchemaServices(services =>
37+
{
38+
services.RemoveAll<IDocumentHashProvider>();
39+
services.AddSingleton<IDocumentHashProvider>(new Sha256DocumentHashProvider(format));
40+
});
41+
}
42+
}

src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public static IServiceCollection AddGraphQLCore(this IServiceCollection services
4848
.TryAddTypeConverter()
4949
.TryAddInputFormatter()
5050
.TryAddInputParser()
51-
.TryAddDefaultDocumentHashProvider()
5251
.TryAddDefaultBatchDispatcher(default)
5352
.TryAddDefaultDataLoaderRegistry()
5453
.TryAddDataLoaderParameterExpressionBuilder()
@@ -168,36 +167,6 @@ private static DefaultRequestExecutorBuilder CreateBuilder(
168167
return builder;
169168
}
170169

171-
public static IServiceCollection AddMD5DocumentHashProvider(
172-
this IServiceCollection services,
173-
HashFormat format = HashFormat.Base64)
174-
{
175-
services.RemoveAll<IDocumentHashProvider>();
176-
services.AddSingleton<IDocumentHashProvider>(
177-
new MD5DocumentHashProvider(format));
178-
return services;
179-
}
180-
181-
public static IServiceCollection AddSha1DocumentHashProvider(
182-
this IServiceCollection services,
183-
HashFormat format = HashFormat.Base64)
184-
{
185-
services.RemoveAll<IDocumentHashProvider>();
186-
services.AddSingleton<IDocumentHashProvider>(
187-
new Sha1DocumentHashProvider(format));
188-
return services;
189-
}
190-
191-
public static IServiceCollection AddSha256DocumentHashProvider(
192-
this IServiceCollection services,
193-
HashFormat format = HashFormat.Base64)
194-
{
195-
services.RemoveAll<IDocumentHashProvider>();
196-
services.AddSingleton<IDocumentHashProvider>(
197-
new Sha256DocumentHashProvider(format));
198-
return services;
199-
}
200-
201170
public static IServiceCollection AddBatchDispatcher<T>(this IServiceCollection services)
202171
where T : class, IBatchDispatcher
203172
{

src/HotChocolate/Core/src/Execution/HotChocolate.Execution.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@
232232
<Compile Update="DependencyInjection\RequestExecutorBuilderExtensions.Caches.cs">
233233
<DependentUpon>RequestExecutorBuilderExtensions.cs</DependentUpon>
234234
</Compile>
235+
<Compile Update="DependencyInjection\RequestExecutorBuilderExtensions.Hashing.cs">
236+
<DependentUpon>RequestExecutorBuilderExtensions.cs</DependentUpon>
237+
</Compile>
235238
</ItemGroup>
236239

237240
<ItemGroup>

src/HotChocolate/Core/src/Execution/RequestExecutorManager.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,7 @@ await typeModuleChangeMonitor.ConfigureAsync(context, cancellationToken)
288288
serviceCollection.AddSingleton<IErrorHandler, DefaultErrorHandler>();
289289
serviceCollection.AddSingleton(
290290
static sp => sp.GetRootServiceProvider().GetRequiredService<ParserOptions>());
291-
serviceCollection.AddSingleton(
292-
static sp => sp.GetRootServiceProvider().GetRequiredService<IDocumentHashProvider>());
291+
serviceCollection.AddSingleton<IDocumentHashProvider>(static _ => new MD5DocumentHashProvider(HashFormat.Hex));
293292

294293
serviceCollection.TryAddDiagnosticEvents();
295294
serviceCollection.TryAddOperationExecutors();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using HotChocolate.Fusion.Configuration;
2+
using HotChocolate.Language;
3+
using Microsoft.Extensions.DependencyInjection.Extensions;
4+
5+
namespace Microsoft.Extensions.DependencyInjection;
6+
7+
public static partial class CoreFusionGatewayBuilderExtensions
8+
{
9+
public static IFusionGatewayBuilder AddMD5DocumentHashProvider(
10+
this IFusionGatewayBuilder builder,
11+
HashFormat format = HashFormat.Base64)
12+
{
13+
return builder.ConfigureSchemaServices((_, services) =>
14+
{
15+
services.RemoveAll<IDocumentHashProvider>();
16+
services.AddSingleton<IDocumentHashProvider>(new MD5DocumentHashProvider(format));
17+
});
18+
}
19+
20+
public static IFusionGatewayBuilder AddSha1DocumentHashProvider(
21+
this IFusionGatewayBuilder builder,
22+
HashFormat format = HashFormat.Base64)
23+
{
24+
return builder.ConfigureSchemaServices((_, services) =>
25+
{
26+
services.RemoveAll<IDocumentHashProvider>();
27+
services.AddSingleton<IDocumentHashProvider>(new Sha1DocumentHashProvider(format));
28+
});
29+
}
30+
31+
public static IFusionGatewayBuilder AddSha256DocumentHashProvider(
32+
this IFusionGatewayBuilder builder,
33+
HashFormat format = HashFormat.Base64)
34+
{
35+
return builder.ConfigureSchemaServices((_, services) =>
36+
{
37+
services.RemoveAll<IDocumentHashProvider>();
38+
services.AddSingleton<IDocumentHashProvider>(new Sha256DocumentHashProvider(format));
39+
});
40+
}
41+
}

0 commit comments

Comments
 (0)