diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Http.cs b/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Http.cs index 74c2a410d39..a25b3e94caa 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Http.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Http.cs @@ -31,8 +31,7 @@ public static IRequestExecutorBuilder AddHttpRequestInterceptor( return builder.ConfigureSchemaServices(s => s .RemoveAll() - .AddSingleton(sp => - ActivatorUtilities.GetServiceOrCreateInstance(sp.GetCombinedServices()))); + .AddSingleton()); } /// @@ -60,7 +59,7 @@ public static IRequestExecutorBuilder AddHttpRequestInterceptor( return builder.ConfigureSchemaServices(s => s .RemoveAll() - .AddSingleton(sp => factory(sp.GetCombinedServices()))); + .AddSingleton(factory)); } /// diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Subscriptions.cs b/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Subscriptions.cs index cbacdb1360e..8b63e85b247 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Subscriptions.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore/Extensions/HotChocolateAspNetCoreServiceCollectionExtensions.Subscriptions.cs @@ -28,8 +28,7 @@ public static IRequestExecutorBuilder AddSocketSessionInterceptor( where T : class, ISocketSessionInterceptor => builder.ConfigureSchemaServices(s => s .RemoveAll() - .AddSingleton( - sp => ActivatorUtilities.GetServiceOrCreateInstance(sp.GetCombinedServices()))); + .AddSingleton()); /// /// Adds an interceptor for GraphQL socket sessions to the GraphQL configuration. @@ -52,7 +51,7 @@ public static IRequestExecutorBuilder AddSocketSessionInterceptor( where T : class, ISocketSessionInterceptor => builder.ConfigureSchemaServices(s => s .RemoveAll() - .AddSingleton(sp => factory(sp.GetCombinedServices()))); + .AddSingleton(factory)); private static IRequestExecutorBuilder AddSubscriptionServices( this IRequestExecutorBuilder builder) diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs index 06c73cd0d03..4c453b09d7a 100644 --- a/src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs @@ -72,51 +72,4 @@ public static IServiceProvider GetRootServiceProvider(this Schema schema) /// public static IServiceProvider GetRootServiceProvider(this IServiceProvider services) => services.GetRequiredService().ServiceProvider; - - /// - /// Gets a service from the root service provider. - /// - /// - /// The type of the service to get. - /// - /// - /// The schema services. - /// - /// - /// The service. - /// - [Obsolete("Use GetRootServiceProvider instead.")] - public static T GetApplicationService(this IServiceProvider services) where T : notnull - => services.GetApplicationServices().GetRequiredService(); - - /// - /// Gets the root service provider from the schema services. This allows - /// schema services to access application level services. - /// - /// - /// The schema services. - /// - /// - /// The root service provider. - /// - [Obsolete("Use GetRootServiceProvider instead.")] - public static IServiceProvider GetApplicationServices(this IServiceProvider services) - => services.GetRootServiceProvider(); - - /// - /// Gets a service provided that represents the combined services from the schema services - /// and application services. - /// - /// - /// The schema services. - /// - /// - /// The service. - /// - public static IServiceProvider GetCombinedServices(this IServiceProvider services) - => services is CombinedServiceProvider combined - ? combined - : new CombinedServiceProvider( - services.GetRootServiceProvider(), - services); } diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs index 884e22ba0fc..b447809afa6 100644 --- a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs +++ b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs @@ -30,8 +30,7 @@ public static IRequestExecutorBuilder AddErrorFilter( ArgumentNullException.ThrowIfNull(factory); return builder.ConfigureSchemaServices( - s => s.AddSingleton( - sp => factory(sp.GetCombinedServices()))); + s => s.AddSingleton(factory)); } public static IRequestExecutorBuilder AddErrorFilter( @@ -42,8 +41,7 @@ public static IRequestExecutorBuilder AddErrorFilter( builder.Services.TryAddSingleton(); return builder.ConfigureSchemaServices( - s => s.AddSingleton( - sp => sp.GetRootServiceProvider().GetRequiredService())); + s => s.AddSingleton()); } public static IServiceCollection AddErrorFilter( diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs index b49f7dad36c..52f73e4c05b 100644 --- a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs +++ b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs @@ -17,26 +17,37 @@ public static IRequestExecutorBuilder AddDiagnosticEventListener( if (typeof(IExecutionDiagnosticEventListener).IsAssignableFrom(typeof(T))) { - builder.Services.TryAddSingleton(); builder.ConfigureSchemaServices( - s => s.AddSingleton( - sp => (IExecutionDiagnosticEventListener)sp.GetRootServiceProvider().GetRequiredService())); + static s => + { + s.TryAddSingleton(); + s.AddSingleton(static sp => (IExecutionDiagnosticEventListener)sp.GetRequiredService()); + }); } else if (typeof(IDataLoaderDiagnosticEventListener).IsAssignableFrom(typeof(T))) { builder.Services.TryAddSingleton(); - builder.Services.AddSingleton(s => (IDataLoaderDiagnosticEventListener)s.GetRequiredService()); + builder.Services.AddSingleton( + static s => (IDataLoaderDiagnosticEventListener)s.GetRequiredService()); } else if (typeof(T).IsDefined(typeof(DiagnosticEventSourceAttribute), true)) { - builder.Services.TryAddSingleton(); + var attribute = (DiagnosticEventSourceAttribute)typeof(T).GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true).First(); + var listener = attribute.Listener; - builder.ConfigureSchemaServices(static s => + if (attribute.IsSchemaService) + { + builder.ConfigureSchemaServices(s => + { + s.TryAddSingleton(); + s.AddSingleton(listener, sp => sp.GetRequiredService()); + }); + } + else { - var attribute = typeof(T).GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true).First(); - var listener = ((DiagnosticEventSourceAttribute)attribute).Listener; - s.AddSingleton(listener, sp => sp.GetRootServiceProvider().GetRequiredService()); - }); + builder.Services.TryAddSingleton(); + builder.Services.AddSingleton(listener, sp => sp.GetRequiredService()); + } } else { @@ -48,43 +59,34 @@ public static IRequestExecutorBuilder AddDiagnosticEventListener( public static IRequestExecutorBuilder AddDiagnosticEventListener( this IRequestExecutorBuilder builder, - Func diagnosticEventListener) + Func factory) where T : class { ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(diagnosticEventListener); + ArgumentNullException.ThrowIfNull(factory); if (typeof(IExecutionDiagnosticEventListener).IsAssignableFrom(typeof(T))) { builder.ConfigureSchemaServices( - s => s.AddSingleton( - sp => (IExecutionDiagnosticEventListener)diagnosticEventListener( - sp.GetCombinedServices()))); + s => s.AddSingleton(sp => (IExecutionDiagnosticEventListener)factory(sp))); } else if (typeof(IDataLoaderDiagnosticEventListener).IsAssignableFrom(typeof(T))) { builder.Services.AddSingleton( - s => (IDataLoaderDiagnosticEventListener)diagnosticEventListener(s)); + s => (IDataLoaderDiagnosticEventListener)factory(s)); } else if (typeof(T).IsDefined(typeof(DiagnosticEventSourceAttribute), true)) { - var attribute = - (DiagnosticEventSourceAttribute)typeof(T) - .GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true) - .First(); + var attribute = (DiagnosticEventSourceAttribute)typeof(T).GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true).First(); + var listener = attribute.Listener; if (attribute.IsSchemaService) { - builder.ConfigureSchemaServices(s => - { - var listener = attribute.Listener; - s.AddSingleton(listener, sp => diagnosticEventListener(sp.GetCombinedServices())); - }); + builder.ConfigureSchemaServices(s => s.AddSingleton(listener, factory)); } else { - var listener = attribute.Listener; - builder.Services.AddSingleton(listener, diagnosticEventListener); + builder.Services.AddSingleton(listener, factory); } } else diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs index e3e45cbc800..0d83d3c6e03 100644 --- a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs +++ b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs @@ -24,8 +24,7 @@ public static IRequestExecutorBuilder AddOperationCompilerOptimizer( ArgumentNullException.ThrowIfNull(builder); builder.ConfigureSchemaServices( - sc => sc.AddSingleton( - sp => factory(sp.GetCombinedServices()))); + sc => sc.AddSingleton(factory)); return builder; } } diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs index 3e72e145196..309dd46d478 100644 --- a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs +++ b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs @@ -33,6 +33,22 @@ public static IRequestExecutorBuilder AddScopedServiceInitializer( builder.Services.AddSingleton(new DelegateServiceInitializer(initializer)); return builder; } + + /// + /// Resolves an instance of from the application + /// service provider and makes it available as a Singleton through the schema + /// service provider. + /// + /// + /// The type of service. + /// + public static IRequestExecutorBuilder AddApplicationService( + this IRequestExecutorBuilder builder) + where TService : class + { + return builder.ConfigureSchemaServices( + static (sp, sc) => sc.AddSingleton(sp.GetRequiredService())); + } } file sealed class DelegateServiceInitializer( diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs index a058b313d41..f274846faf3 100644 --- a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs +++ b/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs @@ -33,14 +33,10 @@ public static IRequestExecutorBuilder AddTransactionScopeHandler( return ConfigureSchemaServices( builder, - services => + static services => { - // we remove all handlers from the schema DI - services.RemoveAll(typeof(ITransactionScopeHandler)); - - // and then reference the transaction scope handler from the global DI. - services.AddSingleton( - s => s.GetRootServiceProvider().GetRequiredService()); + services.RemoveAll(); + services.AddSingleton(); }); } @@ -50,7 +46,7 @@ public static IRequestExecutorBuilder AddTransactionScopeHandler( /// /// The request executor builder. /// - /// + /// /// A factory to create the transaction scope. /// /// @@ -59,17 +55,17 @@ public static IRequestExecutorBuilder AddTransactionScopeHandler( /// public static IRequestExecutorBuilder AddTransactionScopeHandler( this IRequestExecutorBuilder builder, - Func create) + Func factory) { ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(create); + ArgumentNullException.ThrowIfNull(factory); return ConfigureSchemaServices( builder, services => { - services.RemoveAll(typeof(ITransactionScopeHandler)); - services.AddSingleton(sp => create(sp.GetCombinedServices())); + services.RemoveAll(); + services.AddSingleton(factory); }); } @@ -101,10 +97,7 @@ internal static IRequestExecutorBuilder TryAddNoOpTransactionScopeHandler( return ConfigureSchemaServices( builder, - services => - { - services.TryAddSingleton( - sp => sp.GetRootServiceProvider().GetRequiredService()); - }); + static services => + services.TryAddSingleton()); } } diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.CreateInstance.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.CreateInstance.cs index ff0437e9166..f9c97a54dd4 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.CreateInstance.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.CreateInstance.cs @@ -9,7 +9,9 @@ public TypeSystemObject CreateInstance(Type namedSchemaType) { try { - return (TypeSystemObject)ActivatorUtilities.CreateInstance(_combinedServices, namedSchemaType); + var services = _applicationServices ?? _schemaServices; + + return (TypeSystemObject)ActivatorUtilities.CreateInstance(services, namedSchemaType); } catch (Exception ex) { diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs index 0d62a9c6920..c00a001b1e4 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs @@ -1,7 +1,6 @@ using HotChocolate.Internal; using HotChocolate.Types; using HotChocolate.Types.Descriptors; -using HotChocolate.Utilities; namespace HotChocolate.Configuration; @@ -15,7 +14,6 @@ internal sealed partial class TypeRegistrar : ITypeRegistrar private readonly TypeInterceptor _interceptor; private readonly IServiceProvider _schemaServices; private readonly IServiceProvider? _applicationServices; - private readonly IServiceProvider _combinedServices; public TypeRegistrar(IDescriptorContext context, TypeRegistry typeRegistry, @@ -32,10 +30,6 @@ public TypeRegistrar(IDescriptorContext context, throw new ArgumentNullException(nameof(typeInterceptor)); _schemaServices = context.Services; _applicationServices = context.Services.GetService()?.ServiceProvider; - - _combinedServices = _applicationServices is null - ? _schemaServices - : new CombinedServiceProvider(_schemaServices, _applicationServices); } public ISet Scalars { get; } = new HashSet(); diff --git a/src/HotChocolate/Core/src/Types/SchemaBuilder.cs b/src/HotChocolate/Core/src/Types/SchemaBuilder.cs index 9c8db7b2fc9..7713a11d8b1 100644 --- a/src/HotChocolate/Core/src/Types/SchemaBuilder.cs +++ b/src/HotChocolate/Core/src/Types/SchemaBuilder.cs @@ -228,7 +228,7 @@ public ISchemaBuilder AddServices(IServiceProvider services) { ArgumentNullException.ThrowIfNull(services); - _services = _services is null ? services : new CombinedServiceProvider(_services, services); + _services = services; return this; } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index 28d9a613121..39a55e9a812 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,5 +1,6 @@ using HotChocolate.Language; using HotChocolate.Utilities; +using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Execution; @@ -246,9 +247,9 @@ public void BuildRequest_QueryAndServices_RequestIsCreated() OperationRequestBuilder.New() .SetDocument("{ foo }") .SetServices( - new DictionaryServiceProvider( - service.GetType(), - service)) + new ServiceCollection() + .AddSingleton(service.GetType(), service) + .BuildServiceProvider()) .Build(); // assert @@ -268,7 +269,7 @@ public void BuildRequest_SetAll_RequestIsCreated() .SetOperationName("bar") .AddGlobalState("one", "foo") .SetVariableValues(new Dictionary { { "two", "bar" } }) - .SetServices(new DictionaryServiceProvider(service.GetType(), service)) + .SetServices(new ServiceCollection().AddSingleton(service.GetType(), service).BuildServiceProvider()) .Build(); // assert diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index f0d61081424..c9efbb52b40 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,5 +1,6 @@ using HotChocolate.Language; using HotChocolate.Utilities; +using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Execution; @@ -302,10 +303,7 @@ public void BuildRequest_QueryAndServices_RequestIsCreated() var request = OperationRequestBuilder.New() .SetDocument("{ foo }") - .SetServices( - new DictionaryServiceProvider( - service.GetType(), - service)) + .SetServices(new ServiceCollection().AddSingleton(service.GetType(), service).BuildServiceProvider()) .Build(); // assert @@ -325,7 +323,7 @@ public void BuildRequest_SetAll_RequestIsCreated() .SetOperationName("bar") .AddGlobalState("one", "foo") .SetVariableValues(new Dictionary { { "two", "bar" } }) - .SetServices(new DictionaryServiceProvider(service.GetType(), service)) + .SetServices(new ServiceCollection().AddSingleton(service.GetType(), service).BuildServiceProvider()) .Build(); // assert diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/ErrorHandlerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Errors/ErrorHandlerTests.cs index e1619247ae6..04b6ed66d31 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/ErrorHandlerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/ErrorHandlerTests.cs @@ -127,6 +127,7 @@ public async Task AddClassErrorFilterUsingDI_SchemaBuiltViaServiceExtensions_Err // general graphql configuration .AddGraphQL() .AddQueryType() + .AddApplicationService() // error filter configuration .AddErrorFilter() diff --git a/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs index 81787ba6384..125c083cd81 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs @@ -34,6 +34,7 @@ public async Task Intercept_Resolver_Result_With_Listener_2() var services = new ServiceCollection() .AddSingleton() .AddGraphQL() + .AddApplicationService() .AddDiagnosticEventListener() .AddStarWars() .Services diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap index ba40fde6f17..f8943c78f19 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap @@ -9,5 +9,5 @@ For more details look at the `Errors` property. at HotChocolate.Execution.Integration.DataLoader.UseDataLoaderTests.<>c.b__0_1(IObjectTypeDescriptor`1 x) in UseDataLoaderTests.cs:line 16 at HotChocolate.Types.ObjectType`1.CreateConfiguration(ITypeDiscoveryContext context) in ObjectType~1.cs:line 47 at HotChocolate.Types.TypeSystemObject`1.Initialize(ITypeDiscoveryContext context) in TypeSystemObjectBase~1.cs:line 29 - at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 177 + at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 171 diff --git a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs index 596931f6611..c8d89f5dffa 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs @@ -113,7 +113,9 @@ await schema.MakeExecutable().ExecuteAsync( public async Task CustomServiceProvider() { // arrange - var services = new DictionaryServiceProvider(typeof(string), "hello"); + var services = new ServiceCollection() + .AddSingleton(typeof(string), "hello") + .BuildServiceProvider(); // assert var result = diff --git a/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorManagerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorManagerTests.cs index 3c69b81e768..1e4a11d647e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorManagerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorManagerTests.cs @@ -219,7 +219,7 @@ public async Task Ensure_Executor_Is_Created_During_Startup(bool lazyInitializat } } - [Fact(Skip = "SomeService needs to be registered with the schema services")] + [Fact] public async Task WarmupTask_Should_Be_Able_To_Access_Schema_And_Regular_Services() { // arrange @@ -230,6 +230,7 @@ public async Task WarmupTask_Should_Be_Able_To_Access_Schema_And_Regular_Service services .AddGraphQLServer() .AddWarmupTask() + .AddApplicationService() .AddQueryType(d => d.Field("foo").Resolve("")); var provider = services.BuildServiceProvider(); var manager = provider.GetRequiredService(); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Attributes/RequiredAttributeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Attributes/RequiredAttributeTests.cs index b5893e3f8a6..2c75e76c67e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Attributes/RequiredAttributeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Attributes/RequiredAttributeTests.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using HotChocolate.Types.Descriptors; using HotChocolate.Utilities; +using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types; @@ -21,7 +22,9 @@ public void Ignore_RequiredAttribute() { // arrange var inspector = new DefaultTypeInspector(ignoreRequiredAttribute: true); - var services = new DictionaryServiceProvider(typeof(ITypeInspector), inspector); + var services = new ServiceCollection() + .AddSingleton(typeof(ITypeInspector), inspector) + .BuildServiceProvider(); // act & assert SchemaBuilder.New() diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DescriptorContextTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DescriptorContextTests.cs index e06b242e16e..f6493c78031 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DescriptorContextTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DescriptorContextTests.cs @@ -1,6 +1,7 @@ using HotChocolate.Configuration; using HotChocolate.Features; using HotChocolate.Utilities; +using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types.Descriptors; @@ -15,9 +16,9 @@ public void Create_With_Custom_NamingConventions() new XmlDocumentationProvider( new XmlDocumentationFileResolver(), new NoOpStringBuilderPool())); - var services = new DictionaryServiceProvider( - typeof(INamingConventions), - namingConventions); + var services = new ServiceCollection() + .AddSingleton(typeof(INamingConventions), namingConventions) + .BuildServiceProvider(); // act var context = DescriptorContext.Create( @@ -70,9 +71,9 @@ public void Create_With_Custom_TypeInspector() // arrange var options = new SchemaOptions(); var inspector = new DefaultTypeInspector(); - var services = new DictionaryServiceProvider( - typeof(ITypeInspector), - inspector); + var services = new ServiceCollection() + .AddSingleton(typeof(ITypeInspector), inspector) + .BuildServiceProvider(); // act var context = DescriptorContext.Create( diff --git a/src/HotChocolate/Data/src/Data/DataResources.Designer.cs b/src/HotChocolate/Data/src/Data/DataResources.Designer.cs index 784d2e8460c..a915df2a060 100644 --- a/src/HotChocolate/Data/src/Data/DataResources.Designer.cs +++ b/src/HotChocolate/Data/src/Data/DataResources.Designer.cs @@ -11,46 +11,32 @@ namespace HotChocolate.Data { using System; - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class DataResources { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal DataResources() { } - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HotChocolate.Data.DataResources", typeof(DataResources).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Data.DataResources", typeof(DataResources).Assembly); resourceMan = temp; } return resourceMan; } } - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -59,876 +45,585 @@ internal DataResources() { } } - /// - /// Looks up a localized string similar to The provided value for filter `{0}` of type {1} is invalid. Null values are not supported.. - /// - internal static string ErrorHelper_CreateNonNullError { + internal static string FilterField_FilterField_TypeUnknown { get { - return ResourceManager.GetString("ErrorHelper_CreateNonNullError", resourceCulture); + return ResourceManager.GetString("FilterField_FilterField_TypeUnknown", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering could not convert value into desired format.. - /// - internal static string FilterConvention_CouldNotConvertValue { + internal static string FilterConventionDescriptor_MustInheritFromFilterInputType { get { - return ResourceManager.GetString("FilterConvention_CouldNotConvertValue", resourceCulture); + return ResourceManager.GetString("FilterConventionDescriptor_MustInheritFromFilterInputType", resourceCulture); } } - /// - /// Looks up a localized string similar to No configuration was specified.. - /// - internal static string FilterConvention_NoConfigurationSpecified { + internal static string FilterConventionDescriptor_MustImplementIFilterProvider { get { - return ResourceManager.GetString("FilterConvention_NoConfigurationSpecified", resourceCulture); + return ResourceManager.GetString("FilterConventionDescriptor_MustImplementIFilterProvider", resourceCulture); } } - /// - /// Looks up a localized string similar to There is no provider defined for the filter convention `{0}`.. - /// - internal static string FilterConvention_NoProviderFound { + internal static string FilterConvention_NoConfigurationSpecified { get { - return ResourceManager.GetString("FilterConvention_NoProviderFound", resourceCulture); + return ResourceManager.GetString("FilterConvention_NoConfigurationSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to Operation with identifier {0} has no name defined. Add a name to the filter convention. - /// - internal static string FilterConvention_OperationNameNotFound { + internal static string FilterProvider_NoConfigurationSpecified { get { - return ResourceManager.GetString("FilterConvention_OperationNameNotFound", resourceCulture); + return ResourceManager.GetString("FilterProvider_NoConfigurationSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to The filter provider {0} {1}was not initialized by a convention. It is only valid to register a provider over a FilterConvention. - /// - internal static string FilterConvention_ProviderHasToBeInitializedByConvention { + internal static string FilterConvention_UnknownType { get { - return ResourceManager.GetString("FilterConvention_ProviderHasToBeInitializedByConvention", resourceCulture); + return ResourceManager.GetString("FilterConvention_UnknownType", resourceCulture); } } - /// - /// Looks up a localized string similar to The type {0} is unknown. No `FilterType` could be created. - /// - internal static string FilterConvention_TypeIsUnknown { + internal static string FilterInputTypeDescriptor_Operation_OnlyMethods { get { - return ResourceManager.GetString("FilterConvention_TypeIsUnknown", resourceCulture); + return ResourceManager.GetString("FilterInputTypeDescriptor_Operation_OnlyMethods", resourceCulture); } } - /// - /// Looks up a localized string similar to The type of the member {0} of the declaring type {1} is unknown. - /// - internal static string FilterConvention_TypeOfMemberIsUnknown { + internal static string FilterInputTypeDescriptor_Field_OnlyProperties { get { - return ResourceManager.GetString("FilterConvention_TypeOfMemberIsUnknown", resourceCulture); + return ResourceManager.GetString("FilterInputTypeDescriptor_Field_OnlyProperties", resourceCulture); } } - /// - /// Looks up a localized string similar to The type {0} is unknown. - /// - internal static string FilterConvention_UnknownType { + internal static string FilterObjectFieldDescriptorExtensions_UseFiltering_CannotHandleType { get { - return ResourceManager.GetString("FilterConvention_UnknownType", resourceCulture); + return ResourceManager.GetString("FilterObjectFieldDescriptorExtensions_UseFiltering_CannotHandleType", resourceCulture); } } - /// - /// Looks up a localized string similar to A filter provider has to implement `IFilterProvider`.. - /// - internal static string FilterConventionDescriptor_MustImplementIFilterProvider { + internal static string SortField_SortField_TypeUnknown { get { - return ResourceManager.GetString("FilterConventionDescriptor_MustImplementIFilterProvider", resourceCulture); + return ResourceManager.GetString("SortField_SortField_TypeUnknown", resourceCulture); } } - /// - /// Looks up a localized string similar to The filter type must inherit from `FilterInputType`.. - /// - internal static string FilterConventionDescriptor_MustInheritFromFilterInputType { + internal static string Sorting_TypeOfInvalidFormat { get { - return ResourceManager.GetString("FilterConventionDescriptor_MustInheritFromFilterInputType", resourceCulture); + return ResourceManager.GetString("Sorting_TypeOfInvalidFormat", resourceCulture); } } - /// - /// Looks up a localized string similar to No filter convention found for scope `{0}`. Register a convention with `AddConvention<IFilterConvention, TYourConvention>("{0}")` on the schema builder.. - /// - internal static string FilterDescriptorContextExtensions_NoConvention { + internal static string SortConventionDescriptor_MustInheritFromSortInputOrEnumType { get { - return ResourceManager.GetString("FilterDescriptorContextExtensions_NoConvention", resourceCulture); + return ResourceManager.GetString("SortConventionDescriptor_MustInheritFromSortInputOrEnumType", resourceCulture); } } - /// - /// Looks up a localized string similar to No default filter convention found. Call `AddFiltering()` on the schema builder.. - /// - internal static string FilterDescriptorContextExtensions_NoConvention_Default { + internal static string SortConventionDescriptor_MustImplementISortProvider { get { - return ResourceManager.GetString("FilterDescriptorContextExtensions_NoConvention_Default", resourceCulture); + return ResourceManager.GetString("SortConventionDescriptor_MustImplementISortProvider", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to resolve the field runtime type for `{0}.{1}`.. - /// - internal static string FilterField_FilterField_TypeUnknown { + internal static string SortConvention_NoConfigurationSpecified { get { - return ResourceManager.GetString("FilterField_FilterField_TypeUnknown", resourceCulture); + return ResourceManager.GetString("SortConvention_NoConfigurationSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to The {0} could not parse the value of the filter. The value was {1}. The expected type was {2}. This error occurred on {3}.{4}: {5}. - /// - internal static string Filtering_CouldNotParseValue { + internal static string SortProvider_NoConfigurationSpecified { get { - return ResourceManager.GetString("Filtering_CouldNotParseValue", resourceCulture); + return ResourceManager.GetString("SortProvider_NoConfigurationSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering was not found. Register filtering with [UseFiltering] or descriptor.UseFiltering().. - /// - internal static string Filtering_FilteringWasNotFound { + internal static string SortConvention_UnknownType { get { - return ResourceManager.GetString("Filtering_FilteringWasNotFound", resourceCulture); + return ResourceManager.GetString("SortConvention_UnknownType", resourceCulture); } } - /// - /// Looks up a localized string similar to QueryableCombinator {0} could not combine expression. {1} is an invalid combinator. - /// - internal static string Filtering_QueryableCombinator_InvalidCombinator { + internal static string SortInputTypeDescriptor_Field_OnlyProperties { get { - return ResourceManager.GetString("Filtering_QueryableCombinator_InvalidCombinator", resourceCulture); + return ResourceManager.GetString("SortInputTypeDescriptor_Field_OnlyProperties", resourceCulture); } } - /// - /// Looks up a localized string similar to QueryableCombinator {0} could not combine expressions. There were no expressions to combine.. - /// - internal static string Filtering_QueryableCombinator_QueueEmpty { + internal static string SortObjectFieldDescriptorExtensions_UseSorting_CannotHandleType { get { - return ResourceManager.GetString("Filtering_QueryableCombinator_QueueEmpty", resourceCulture); + return ResourceManager.GetString("SortObjectFieldDescriptorExtensions_UseSorting_CannotHandleType", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering is expected to be of type {0}, but was of type {1}. - /// - internal static string Filtering_TypeMismatch { + internal static string SortingVisitor_ListInput_AreNotSupported { get { - return ResourceManager.GetString("Filtering_TypeMismatch", resourceCulture); + return ResourceManager.GetString("SortingVisitor_ListInput_AreNotSupported", resourceCulture); } } - /// - /// Looks up a localized string similar to Only properties are supported as fields.. - /// - internal static string FilterInputTypeDescriptor_Field_OnlyProperties { + internal static string SortingEnumType_Cannot_ParseLiteral { get { - return ResourceManager.GetString("FilterInputTypeDescriptor_Field_OnlyProperties", resourceCulture); + return ResourceManager.GetString("SortingEnumType_Cannot_ParseLiteral", resourceCulture); } } - /// - /// Looks up a localized string similar to Only method are allowed for filter operations.. - /// - internal static string FilterInputTypeDescriptor_Operation_OnlyMethods { + internal static string SortInvocation_Cannot_SortOnFields { get { - return ResourceManager.GetString("FilterInputTypeDescriptor_Operation_OnlyMethods", resourceCulture); + return ResourceManager.GetString("SortInvocation_Cannot_SortOnFields", resourceCulture); } } - /// - /// Looks up a localized string similar to For the field {0} of type {1} was no handler found.. - /// - internal static string FilterInterceptor_NoHandlerFoundForField { + internal static string QueryableSortHandler_InvalidSelector { get { - return ResourceManager.GetString("FilterInterceptor_NoHandlerFoundForField", resourceCulture); + return ResourceManager.GetString("QueryableSortHandler_InvalidSelector", resourceCulture); } } - /// - /// Looks up a localized string similar to For the operation {0} of type {1} was no type specified found.. - /// - internal static string FilterInterceptor_OperationHasNoTypeSpecified { + internal static string FilterConvention_CouldNotConvertValue { get { - return ResourceManager.GetString("FilterInterceptor_OperationHasNoTypeSpecified", resourceCulture); + return ResourceManager.GetString("FilterConvention_CouldNotConvertValue", resourceCulture); } } - /// - /// Looks up a localized string similar to The filter type cannot be inferred from `System.Object`.. - /// internal static string FilterObjectFieldDescriptorExtensions_CannotInfer { get { return ResourceManager.GetString("FilterObjectFieldDescriptorExtensions_CannotInfer", resourceCulture); } } - /// - /// Looks up a localized string similar to Cannot handle the specified filter type.. - /// - internal static string FilterObjectFieldDescriptorExtensions_UseFiltering_CannotHandleType { + internal static string FilterDescriptorContextExtensions_NoConvention { get { - return ResourceManager.GetString("FilterObjectFieldDescriptorExtensions_UseFiltering_CannotHandleType", resourceCulture); + return ResourceManager.GetString("FilterDescriptorContextExtensions_NoConvention", resourceCulture); } } - /// - /// Looks up a localized string similar to No configuration was specified.. - /// - internal static string FilterProvider_NoConfigurationSpecified { + internal static string FilterDescriptorContextExtensions_NoConvention_Default { get { - return ResourceManager.GetString("FilterProvider_NoConfigurationSpecified", resourceCulture); + return ResourceManager.GetString("FilterDescriptorContextExtensions_NoConvention_Default", resourceCulture); } } - /// - /// Looks up a localized string similar to The filter provider `{0}` does not specify and field handler.. - /// - internal static string FilterProvider_NoHandlersConfigured { + internal static string SortProvider_NoFieldHandlersConfigured { get { - return ResourceManager.GetString("FilterProvider_NoHandlersConfigured", resourceCulture); + return ResourceManager.GetString("SortProvider_NoFieldHandlersConfigured", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to create field handler `{0}` for filter provider `{1}`.. - /// - internal static string FilterProvider_UnableToCreateFieldHandler { + internal static string SortProvider_NoOperationHandlersConfigured { get { - return ResourceManager.GetString("FilterProvider_UnableToCreateFieldHandler", resourceCulture); + return ResourceManager.GetString("SortProvider_NoOperationHandlersConfigured", resourceCulture); } } - /// - /// Looks up a localized string similar to Filter visitor encountered invalid field. - /// - internal static string FilterVisitor_InvalidField { + internal static string SortDescriptorContextExtensions_NoConvention { get { - return ResourceManager.GetString("FilterVisitor_InvalidField", resourceCulture); + return ResourceManager.GetString("SortDescriptorContextExtensions_NoConvention", resourceCulture); } } - /// - /// Looks up a localized string similar to Filter visitor encountered invalid type. - /// - internal static string FilterVisitor_InvalidType { + internal static string SortDescriptorContextExtensions_NoConvention_Default { get { - return ResourceManager.GetString("FilterVisitor_InvalidType", resourceCulture); + return ResourceManager.GetString("SortDescriptorContextExtensions_NoConvention_Default", resourceCulture); } } - /// - /// Looks up a localized string similar to The IDs `{0}` have an invalid format.. - /// - internal static string GlobalIdInputValueFormatter_IdsHaveInvalidFormat { + internal static string SortInterceptor_NoFieldHandlerFoundForField { get { - return ResourceManager.GetString("GlobalIdInputValueFormatter_IdsHaveInvalidFormat", resourceCulture); + return ResourceManager.GetString("SortInterceptor_NoFieldHandlerFoundForField", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified value is not a valid ID value.. - /// - internal static string GlobalIdInputValueFormatter_SpecifiedValueIsNotAValidId { + internal static string SortInterceptor_NoOperationHandlerFoundForValue { get { - return ResourceManager.GetString("GlobalIdInputValueFormatter_SpecifiedValueIsNotAValidId", resourceCulture); + return ResourceManager.GetString("SortInterceptor_NoOperationHandlerFoundForValue", resourceCulture); } } - /// - /// Looks up a localized string similar to Provided string was empty.. - /// - internal static string NameHelpers_UppercaseFirstLetter { + internal static string SortConvention_NoProviderFound { get { - return ResourceManager.GetString("NameHelpers_UppercaseFirstLetter", resourceCulture); + return ResourceManager.GetString("SortConvention_NoProviderFound", resourceCulture); } } - /// - /// Looks up a localized string similar to The paging projection optimizer was applied to a field that is not of IPageType. The problem encounter on {0}.{1} : {2}. - /// - internal static string PagingProjectionOptimizer_NotAPagingField { + internal static string SortConvention_TypeOfMemberIsUnknown { get { - return ResourceManager.GetString("PagingProjectionOptimizer_NotAPagingField", resourceCulture); + return ResourceManager.GetString("SortConvention_TypeOfMemberIsUnknown", resourceCulture); } } - /// - /// Looks up a localized string similar to Projection was not found. Register projection with [UseProjection] or descriptor.UseProjection().. - /// - internal static string Projection_ProjectionWasNotFound { + internal static string Sorting_SortingWasNotFound { get { - return ResourceManager.GetString("Projection_ProjectionWasNotFound", resourceCulture); + return ResourceManager.GetString("Sorting_SortingWasNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to Projection is expected to be of type {0}, but was of type {1}. - /// - internal static string Projection_TypeMismatch { + internal static string Sorting_TypeMismatch { get { - return ResourceManager.GetString("Projection_TypeMismatch", resourceCulture); + return ResourceManager.GetString("Sorting_TypeMismatch", resourceCulture); } } - /// - /// Looks up a localized string similar to Projection Visitor is in invalid state. Projection failed!. - /// - internal static string ProjectionConvention_CouldNotProject { + internal static string FilterConvention_NoProviderFound { get { - return ResourceManager.GetString("ProjectionConvention_CouldNotProject", resourceCulture); + return ResourceManager.GetString("FilterConvention_NoProviderFound", resourceCulture); } } - /// - /// Looks up a localized string similar to No configuration was specified.. - /// - internal static string ProjectionConvention_NoConfigurationSpecified { + internal static string FilterConvention_TypeOfMemberIsUnknown { get { - return ResourceManager.GetString("ProjectionConvention_NoConfigurationSpecified", resourceCulture); + return ResourceManager.GetString("FilterConvention_TypeOfMemberIsUnknown", resourceCulture); } } - /// - /// Looks up a localized string similar to The Query.node field is in an invalid state. The context data was empty, but it is expected to contain at least one element. - /// - internal static string ProjectionConvention_NodeFieldWasInInvalidState { + internal static string FilterConvention_TypeIsUnknown { get { - return ResourceManager.GetString("ProjectionConvention_NodeFieldWasInInvalidState", resourceCulture); + return ResourceManager.GetString("FilterConvention_TypeIsUnknown", resourceCulture); } } - /// - /// Looks up a localized string similar to There is no provider defined for the projection convention `{0}`.. - /// - internal static string ProjectionConvention_NoProviderFound { + internal static string SortConvention_OperationNameNotFound { get { - return ResourceManager.GetString("ProjectionConvention_NoProviderFound", resourceCulture); + return ResourceManager.GetString("SortConvention_OperationNameNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to A projection provider has to implement `IProjectionProvider`.. - /// - internal static string ProjectionConventionDescriptor_MustImplementIProjectionProvider { + internal static string SortObjectFieldDescriptorExtensions_CannotInfer { get { - return ResourceManager.GetString("ProjectionConventionDescriptor_MustImplementIProjectionProvider", resourceCulture); + return ResourceManager.GetString("SortObjectFieldDescriptorExtensions_CannotInfer", resourceCulture); } } - /// - /// Looks up a localized string similar to There is no selection that matches the specified field.. - /// - internal static string ProjectionObjectFieldDescriptorExtensions_UnwrapMutationPayloadSelect_Failed { + internal static string FilterConvention_OperationNameNotFound { get { - return ResourceManager.GetString("ProjectionObjectFieldDescriptorExtensions_UnwrapMutationPayloadSelect_Failed", resourceCulture); + return ResourceManager.GetString("FilterConvention_OperationNameNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to Could not project filters on field. - /// - internal static string ProjectionProvider_CouldNotProjectFiltering { + internal static string FilterProvider_NoHandlersConfigured { get { - return ResourceManager.GetString("ProjectionProvider_CouldNotProjectFiltering", resourceCulture); + return ResourceManager.GetString("FilterProvider_NoHandlersConfigured", resourceCulture); } } - /// - /// Looks up a localized string similar to Could not project sorting on field. - /// - internal static string ProjectionProvider_CouldNotProjectSorting { + internal static string Filtering_FilteringWasNotFound { get { - return ResourceManager.GetString("ProjectionProvider_CouldNotProjectSorting", resourceCulture); + return ResourceManager.GetString("Filtering_FilteringWasNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to Sequence contains more than one element.. - /// - internal static string ProjectionProvider_CreateMoreThanOneError { + internal static string Filtering_TypeMismatch { get { - return ResourceManager.GetString("ProjectionProvider_CreateMoreThanOneError", resourceCulture); + return ResourceManager.GetString("Filtering_TypeMismatch", resourceCulture); } } - /// - /// Looks up a localized string similar to No configuration was specified.. - /// - internal static string ProjectionProvider_NoConfigurationSpecified { + internal static string FilterInterceptor_NoHandlerFoundForField { get { - return ResourceManager.GetString("ProjectionProvider_NoConfigurationSpecified", resourceCulture); + return ResourceManager.GetString("FilterInterceptor_NoHandlerFoundForField", resourceCulture); } } - /// - /// Looks up a localized string similar to The projection convention `{0}` does not specify and field handler.. - /// - internal static string ProjectionProvider_NoHandlersConfigured { + internal static string FilterInterceptor_OperationHasNoTypeSpecified { get { - return ResourceManager.GetString("ProjectionProvider_NoHandlersConfigured", resourceCulture); + return ResourceManager.GetString("FilterInterceptor_OperationHasNoTypeSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to create field handler `{0}` for projection convention `{1}`.. - /// - internal static string ProjectionProvider_UnableToCreateFieldHandler { + internal static string ErrorHelper_CreateNonNullError { get { - return ResourceManager.GetString("ProjectionProvider_UnableToCreateFieldHandler", resourceCulture); + return ResourceManager.GetString("ErrorHelper_CreateNonNullError", resourceCulture); } } - /// - /// Looks up a localized string similar to Could not unwrap runtime type of type {0}.. - /// - internal static string ProjectionVisitor_CouldNotUnwrapType { + internal static string FilterProvider_UnableToCreateFieldHandler { get { - return ResourceManager.GetString("ProjectionVisitor_CouldNotUnwrapType", resourceCulture); + return ResourceManager.GetString("FilterProvider_UnableToCreateFieldHandler", resourceCulture); } } - /// - /// Looks up a localized string similar to The visitor is in an invalid state. No parent scope could be found. - /// - internal static string ProjectionVisitor_InvalidState_NoParentScope { + internal static string SortProvider_UnableToCreateFieldHandler { get { - return ResourceManager.GetString("ProjectionVisitor_InvalidState_NoParentScope", resourceCulture); + return ResourceManager.GetString("SortProvider_UnableToCreateFieldHandler", resourceCulture); } } - /// - /// Looks up a localized string similar to Projections needs a member of type PropertyInfo or MethodInfo but received {0}!. - /// - internal static string ProjectionVisitor_MemberInvalid { + internal static string SortProvider_UnableToCreateOperationHandler { get { - return ResourceManager.GetString("ProjectionVisitor_MemberInvalid", resourceCulture); + return ResourceManager.GetString("SortProvider_UnableToCreateOperationHandler", resourceCulture); } } - /// - /// Looks up a localized string similar to The expression {0} could not be projected. No constructor was found for `Set` type {1}.. - /// - internal static string ProjectionVisitor_NoConstructorFoundForSet { + internal static string SortEnumValue_ValueIsNull { get { - return ResourceManager.GetString("ProjectionVisitor_NoConstructorFoundForSet", resourceCulture); + return ResourceManager.GetString("SortEnumValue_ValueIsNull", resourceCulture); } } - /// - /// Looks up a localized string similar to Type {0} does not contain a valid node field. Only `items` and `nodes` are supported. - /// - internal static string ProjectionVisitor_NodeFieldWasNotFound { + internal static string SortVisitor_InvalidField { get { - return ResourceManager.GetString("ProjectionVisitor_NodeFieldWasNotFound", resourceCulture); + return ResourceManager.GetString("SortVisitor_InvalidField", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering needs a member of type PropertyInfo or MethodInfo no member was found!. - /// - internal static string ProjectionVisitor_NoMemberFound { + internal static string SortVisitor_InvalidType { get { - return ResourceManager.GetString("ProjectionVisitor_NoMemberFound", resourceCulture); + return ResourceManager.GetString("SortVisitor_InvalidType", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering needs an expression with exactly one parameter of type {0}! This error occurred on {1}.{2}: {3}. - /// - internal static string QueryableFiltering_ExpressionParameterInvalid { + internal static string FilterVisitor_InvalidType { get { - return ResourceManager.GetString("QueryableFiltering_ExpressionParameterInvalid", resourceCulture); + return ResourceManager.GetString("FilterVisitor_InvalidType", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering needs a member of type PropertyInfo or MethodInfo but received {0}! This error occurred on {1}.{2}: {3}. - /// - internal static string QueryableFiltering_MemberInvalid { + internal static string FilterVisitor_InvalidField { get { - return ResourceManager.GetString("QueryableFiltering_MemberInvalid", resourceCulture); + return ResourceManager.GetString("FilterVisitor_InvalidField", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering needs a member of type PropertyInfo or MethodInfo no member was found! This error occurred on {0}.{1}: {2}. - /// - internal static string QueryableFiltering_NoMemberDeclared { + internal static string ProjectionProvider_NoConfigurationSpecified { get { - return ResourceManager.GetString("QueryableFiltering_NoMemberDeclared", resourceCulture); + return ResourceManager.GetString("ProjectionProvider_NoConfigurationSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to Filtering needs an expression with exactly one parameter of type {0}! Check the expression on field {1}.. - /// - internal static string QueryableFilterProvider_ExpressionParameterInvalid { + internal static string ProjectionProvider_UnableToCreateFieldHandler { get { - return ResourceManager.GetString("QueryableFilterProvider_ExpressionParameterInvalid", resourceCulture); + return ResourceManager.GetString("ProjectionProvider_UnableToCreateFieldHandler", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting has encountered invalid selector. - /// - internal static string QueryableSortHandler_InvalidSelector { + internal static string ProjectionProvider_NoHandlersConfigured { get { - return ResourceManager.GetString("QueryableSortHandler_InvalidSelector", resourceCulture); + return ResourceManager.GetString("ProjectionProvider_NoHandlersConfigured", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting needs an expression with exactly one parameter of type {0}! This error occurred on {1}.{2}: {3}. - /// - internal static string QueryableSorting_ExpressionParameterInvalid { + internal static string ProjectionConvention_NoConfigurationSpecified { get { - return ResourceManager.GetString("QueryableSorting_ExpressionParameterInvalid", resourceCulture); + return ResourceManager.GetString("ProjectionConvention_NoConfigurationSpecified", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting needs a member of type PropertyInfo or MethodInfo but received {0}! This error occurred on {1}.{2}: {3}. - /// - internal static string QueryableSorting_MemberInvalid { + internal static string ProjectionConvention_NoProviderFound { get { - return ResourceManager.GetString("QueryableSorting_MemberInvalid", resourceCulture); + return ResourceManager.GetString("ProjectionConvention_NoProviderFound", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting needs a member of type PropertyInfo or MethodInfo no member was found! This error occurred on {0}.{1}: {2}. - /// - internal static string QueryableSorting_NoMemberDeclared { + internal static string ProjectionConventionDescriptor_MustImplementIProjectionProvider { get { - return ResourceManager.GetString("QueryableSorting_NoMemberDeclared", resourceCulture); + return ResourceManager.GetString("ProjectionConventionDescriptor_MustImplementIProjectionProvider", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting needs an expression with exactly one parameter of type {0}! Check the expression on field {1}.. - /// - internal static string QueryableSortProvider_ExpressionParameterInvalid { + internal static string ProjectionProvider_CreateMoreThanOneError { get { - return ResourceManager.GetString("QueryableSortProvider_ExpressionParameterInvalid", resourceCulture); + return ResourceManager.GetString("ProjectionProvider_CreateMoreThanOneError", resourceCulture); } } - /// - /// Looks up a localized string similar to The type {0} is an abstract type. You need to provide a type for a selection of an interface or union. Possible types are: {1}. - /// - internal static string SelectionContext_NoTypeForAbstractFieldProvided { + internal static string ProjectionProvider_CouldNotProjectFiltering { get { - return ResourceManager.GetString("SelectionContext_NoTypeForAbstractFieldProvided", resourceCulture); + return ResourceManager.GetString("ProjectionProvider_CouldNotProjectFiltering", resourceCulture); } } - /// - /// Looks up a localized string similar to No configuration was specified.. - /// - internal static string SortConvention_NoConfigurationSpecified { + internal static string ProjectionProvider_CouldNotProjectSorting { get { - return ResourceManager.GetString("SortConvention_NoConfigurationSpecified", resourceCulture); + return ResourceManager.GetString("ProjectionProvider_CouldNotProjectSorting", resourceCulture); } } - /// - /// Looks up a localized string similar to There is no provider defined for the sorting convention `{0}`.. - /// - internal static string SortConvention_NoProviderFound { + internal static string ProjectionConvention_CouldNotProject { get { - return ResourceManager.GetString("SortConvention_NoProviderFound", resourceCulture); + return ResourceManager.GetString("ProjectionConvention_CouldNotProject", resourceCulture); } } - /// - /// Looks up a localized string similar to Operation with identifier {0} has no name defined. Add a name to the sort convention. - /// - internal static string SortConvention_OperationNameNotFound { + internal static string ProjectionConvention_NodeFieldWasInInvalidState { get { - return ResourceManager.GetString("SortConvention_OperationNameNotFound", resourceCulture); + return ResourceManager.GetString("ProjectionConvention_NodeFieldWasInInvalidState", resourceCulture); } } - /// - /// Looks up a localized string similar to The sort provider {0} {1}was not initialized by a convention. It is only valid to register a provider over a SortConvention. - /// - internal static string SortConvention_ProviderHasToBeInitializedByConvention { + internal static string ProjectionVisitor_NodeFieldWasNotFound { get { - return ResourceManager.GetString("SortConvention_ProviderHasToBeInitializedByConvention", resourceCulture); + return ResourceManager.GetString("ProjectionVisitor_NodeFieldWasNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to The type of the member {0} of the declaring type {1} is unknown. - /// - internal static string SortConvention_TypeOfMemberIsUnknown { + internal static string Projection_ProjectionWasNotFound { get { - return ResourceManager.GetString("SortConvention_TypeOfMemberIsUnknown", resourceCulture); + return ResourceManager.GetString("Projection_ProjectionWasNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to The type {0} is unknown. - /// - internal static string SortConvention_UnknownType { + internal static string Projection_TypeMismatch { get { - return ResourceManager.GetString("SortConvention_UnknownType", resourceCulture); + return ResourceManager.GetString("Projection_TypeMismatch", resourceCulture); } } - /// - /// Looks up a localized string similar to A sorting provider has to implement `ISortProvider`.. - /// - internal static string SortConventionDescriptor_MustImplementISortProvider { + internal static string FilterConvention_ProviderHasToBeInitializedByConvention { get { - return ResourceManager.GetString("SortConventionDescriptor_MustImplementISortProvider", resourceCulture); + return ResourceManager.GetString("FilterConvention_ProviderHasToBeInitializedByConvention", resourceCulture); } } - /// - /// Looks up a localized string similar to The sorting type must inherit from `SortInputType` or `SortEnumType`.. - /// - internal static string SortConventionDescriptor_MustInheritFromSortInputOrEnumType { + internal static string SortConvention_ProviderHasToBeInitializedByConvention { get { - return ResourceManager.GetString("SortConventionDescriptor_MustInheritFromSortInputOrEnumType", resourceCulture); + return ResourceManager.GetString("SortConvention_ProviderHasToBeInitializedByConvention", resourceCulture); } } - /// - /// Looks up a localized string similar to No sorting convention found for scope `{0}`. Register a convention with `AddConvention<ISortConvention, TYourConvention>("{0}")` on the schema builder.. - /// - internal static string SortDescriptorContextExtensions_NoConvention { + internal static string UseProjection_CannotHandleType { get { - return ResourceManager.GetString("SortDescriptorContextExtensions_NoConvention", resourceCulture); + return ResourceManager.GetString("UseProjection_CannotHandleType", resourceCulture); } } - /// - /// Looks up a localized string similar to No default sorting convention found. Call `AddSorting()` on the schema builder.. - /// - internal static string SortDescriptorContextExtensions_NoConvention_Default { + internal static string PagingProjectionOptimizer_NotAPagingField { get { - return ResourceManager.GetString("SortDescriptorContextExtensions_NoConvention_Default", resourceCulture); + return ResourceManager.GetString("PagingProjectionOptimizer_NotAPagingField", resourceCulture); } } - /// - /// Looks up a localized string similar to The inner value of enum value cannot be null or empty. - /// - internal static string SortEnumValue_ValueIsNull { + internal static string Filtering_CouldNotParseValue { get { - return ResourceManager.GetString("SortEnumValue_ValueIsNull", resourceCulture); + return ResourceManager.GetString("Filtering_CouldNotParseValue", resourceCulture); } } - /// - /// Looks up a localized string similar to Sort field could not be created. No handler was found!.. - /// - internal static string SortField_ArgumentInvalid_NoHandlerWasFound { + internal static string QueryableFiltering_MemberInvalid { get { - return ResourceManager.GetString("SortField_ArgumentInvalid_NoHandlerWasFound", resourceCulture); + return ResourceManager.GetString("QueryableFiltering_MemberInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to resolve the field runtime type for `{0}.{1}`.. - /// - internal static string SortField_SortField_TypeUnknown { + internal static string QueryableFiltering_ExpressionParameterInvalid { get { - return ResourceManager.GetString("SortField_SortField_TypeUnknown", resourceCulture); + return ResourceManager.GetString("QueryableFiltering_ExpressionParameterInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting is in an invalid state. The parent was no sort field selector. This error occurred on {0}.{1}: {2}. - /// - internal static string Sorting_InvalidState_ParentIsNoFieldSelector { + internal static string QueryableFilterProvider_ExpressionParameterInvalid { get { - return ResourceManager.GetString("Sorting_InvalidState_ParentIsNoFieldSelector", resourceCulture); + return ResourceManager.GetString("QueryableFilterProvider_ExpressionParameterInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting was not found. Register sorting with [UseSorting] or descriptor.UseSorting().. - /// - internal static string Sorting_SortingWasNotFound { + internal static string QueryableFiltering_NoMemberDeclared { get { - return ResourceManager.GetString("Sorting_SortingWasNotFound", resourceCulture); + return ResourceManager.GetString("QueryableFiltering_NoMemberDeclared", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting is expected to be of type {0}, but was of type {1}. - /// - internal static string Sorting_TypeMismatch { + internal static string Filtering_QueryableCombinator_QueueEmpty { get { - return ResourceManager.GetString("Sorting_TypeMismatch", resourceCulture); + return ResourceManager.GetString("Filtering_QueryableCombinator_QueueEmpty", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to resolve sorting type. {0} is of invalid format.. - /// - internal static string Sorting_TypeOfInvalidFormat { + internal static string Filtering_QueryableCombinator_InvalidCombinator { get { - return ResourceManager.GetString("Sorting_TypeOfInvalidFormat", resourceCulture); + return ResourceManager.GetString("Filtering_QueryableCombinator_InvalidCombinator", resourceCulture); } } - /// - /// Looks up a localized string similar to {0} cannot parse the given literal of type `{1}`.. - /// - internal static string SortingEnumType_Cannot_ParseLiteral { + internal static string ProjectionVisitor_MemberInvalid { get { - return ResourceManager.GetString("SortingEnumType_Cannot_ParseLiteral", resourceCulture); + return ResourceManager.GetString("ProjectionVisitor_MemberInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to Lists are not supported by sorting!. - /// - internal static string SortingVisitor_ListInput_AreNotSupported { + internal static string ProjectionVisitor_NoMemberFound { get { - return ResourceManager.GetString("SortingVisitor_ListInput_AreNotSupported", resourceCulture); + return ResourceManager.GetString("ProjectionVisitor_NoMemberFound", resourceCulture); } } - /// - /// Looks up a localized string similar to Only properties are supported as fields.. - /// - internal static string SortInputTypeDescriptor_Field_OnlyProperties { + internal static string ProjectionVisitor_InvalidState_NoParentScope { get { - return ResourceManager.GetString("SortInputTypeDescriptor_Field_OnlyProperties", resourceCulture); + return ResourceManager.GetString("ProjectionVisitor_InvalidState_NoParentScope", resourceCulture); } } - /// - /// Looks up a localized string similar to For the field {0} of type {1} was no field handler found.. - /// - internal static string SortInterceptor_NoFieldHandlerFoundForField { + internal static string ProjectionVisitor_NoConstructorFoundForSet { get { - return ResourceManager.GetString("SortInterceptor_NoFieldHandlerFoundForField", resourceCulture); + return ResourceManager.GetString("ProjectionVisitor_NoConstructorFoundForSet", resourceCulture); } } - /// - /// Looks up a localized string similar to For the value {0} of type {1} was no operation handler found.. - /// - internal static string SortInterceptor_NoOperationHandlerFoundForValue { + internal static string Sorting_InvalidState_ParentIsNoFieldSelector { get { - return ResourceManager.GetString("SortInterceptor_NoOperationHandlerFoundForValue", resourceCulture); + return ResourceManager.GetString("Sorting_InvalidState_ParentIsNoFieldSelector", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting on fields with no operation is not supported. - /// - internal static string SortInvocation_Cannot_SortOnFields { + internal static string QueryableSorting_MemberInvalid { get { - return ResourceManager.GetString("SortInvocation_Cannot_SortOnFields", resourceCulture); + return ResourceManager.GetString("QueryableSorting_MemberInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to The sort type cannot be inferred from `System.Object`.. - /// - internal static string SortObjectFieldDescriptorExtensions_CannotInfer { + internal static string QueryableSorting_ExpressionParameterInvalid { get { - return ResourceManager.GetString("SortObjectFieldDescriptorExtensions_CannotInfer", resourceCulture); + return ResourceManager.GetString("QueryableSorting_ExpressionParameterInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to Cannot handle the specified filter type.. - /// - internal static string SortObjectFieldDescriptorExtensions_UseSorting_CannotHandleType { + internal static string QueryableSortProvider_ExpressionParameterInvalid { get { - return ResourceManager.GetString("SortObjectFieldDescriptorExtensions_UseSorting_CannotHandleType", resourceCulture); + return ResourceManager.GetString("QueryableSortProvider_ExpressionParameterInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to No configuration was specified.. - /// - internal static string SortProvider_NoConfigurationSpecified { + internal static string QueryableSorting_NoMemberDeclared { get { - return ResourceManager.GetString("SortProvider_NoConfigurationSpecified", resourceCulture); + return ResourceManager.GetString("QueryableSorting_NoMemberDeclared", resourceCulture); } } - /// - /// Looks up a localized string similar to The sort provider `{0}` does not specify and field handler.. - /// - internal static string SortProvider_NoFieldHandlersConfigured { + internal static string SortField_ArgumentInvalid_NoHandlerWasFound { get { - return ResourceManager.GetString("SortProvider_NoFieldHandlersConfigured", resourceCulture); + return ResourceManager.GetString("SortField_ArgumentInvalid_NoHandlerWasFound", resourceCulture); } } - /// - /// Looks up a localized string similar to The sort provider `{0}` does not specify and operation handler.. - /// - internal static string SortProvider_NoOperationHandlersConfigured { + internal static string ProjectionVisitor_CouldNotUnwrapType { get { - return ResourceManager.GetString("SortProvider_NoOperationHandlersConfigured", resourceCulture); + return ResourceManager.GetString("ProjectionVisitor_CouldNotUnwrapType", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to create field handler `{0}` for sort provider `{1}`.. - /// - internal static string SortProvider_UnableToCreateFieldHandler { + internal static string GlobalIdInputValueFormatter_SpecifiedValueIsNotAValidId { get { - return ResourceManager.GetString("SortProvider_UnableToCreateFieldHandler", resourceCulture); + return ResourceManager.GetString("GlobalIdInputValueFormatter_SpecifiedValueIsNotAValidId", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to create operation handler `{0}` for sort provider `{1}`.. - /// - internal static string SortProvider_UnableToCreateOperationHandler { + internal static string GlobalIdInputValueFormatter_IdsHaveInvalidFormat { get { - return ResourceManager.GetString("SortProvider_UnableToCreateOperationHandler", resourceCulture); + return ResourceManager.GetString("GlobalIdInputValueFormatter_IdsHaveInvalidFormat", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting visitor encountered invalid field. - /// - internal static string SortVisitor_InvalidField { + internal static string SelectionContext_NoTypeForAbstractFieldProvided { get { - return ResourceManager.GetString("SortVisitor_InvalidField", resourceCulture); + return ResourceManager.GetString("SelectionContext_NoTypeForAbstractFieldProvided", resourceCulture); } } - /// - /// Looks up a localized string similar to Sorting visitor encountered invalid type. - /// - internal static string SortVisitor_InvalidType { + internal static string NameHelpers_UppercaseFirstLetter { get { - return ResourceManager.GetString("SortVisitor_InvalidType", resourceCulture); + return ResourceManager.GetString("NameHelpers_UppercaseFirstLetter", resourceCulture); } } - /// - /// Looks up a localized string similar to Cannot handle the specified type.. - /// - internal static string UseProjection_CannotHandleType { + internal static string ProjectionObjectFieldDescriptorExtensions_UnwrapMutationPayloadSelect_Failed { get { - return ResourceManager.GetString("UseProjection_CannotHandleType", resourceCulture); + return ResourceManager.GetString("ProjectionObjectFieldDescriptorExtensions_UnwrapMutationPayloadSelect_Failed", resourceCulture); } } } diff --git a/src/HotChocolate/Data/src/Data/DataResources.resx b/src/HotChocolate/Data/src/Data/DataResources.resx index 0dd5af7010e..b9078c1f1cb 100644 --- a/src/HotChocolate/Data/src/Data/DataResources.resx +++ b/src/HotChocolate/Data/src/Data/DataResources.resx @@ -170,13 +170,13 @@ The provided value for filter `{0}` of type {1} is invalid. Null values are not supported. - Unable to create field handler `{0}` for filter provider `{1}`. + Unable to create field handler for filter provider `{0}`. - Unable to create field handler `{0}` for sort provider `{1}`. + Unable to create field handler for sort provider `{0}`. - Unable to create operation handler `{0}` for sort provider `{1}`. + Unable to create operation handler for sort provider `{0}`. The inner value of enum value cannot be null or empty @@ -197,7 +197,7 @@ No configuration was specified. - Unable to create field handler `{0}` for projection convention `{1}`. + Unable to create field handler for projection provider `{0}`. The projection convention `{0}` does not specify and field handler. diff --git a/src/HotChocolate/Data/src/Data/ErrorHelper.cs b/src/HotChocolate/Data/src/Data/ErrorHelper.cs index ce08b07c5ab..9bfd0c5ae0e 100644 --- a/src/HotChocolate/Data/src/Data/ErrorHelper.cs +++ b/src/HotChocolate/Data/src/Data/ErrorHelper.cs @@ -66,14 +66,13 @@ public static IError CreateNonNullError( public static ISchemaError ProjectionConvention_UnableToCreateFieldHandler( IProjectionProvider convention, - Type fieldHandler) => + Exception exception) => SchemaErrorBuilder.New() .SetMessage( - DataResources.FilterProvider_UnableToCreateFieldHandler, - fieldHandler.FullName ?? fieldHandler.Name, + DataResources.ProjectionProvider_UnableToCreateFieldHandler, convention.GetType().FullName ?? convention.GetType().Name) .SetExtension(nameof(convention), convention) - .SetExtension(nameof(fieldHandler), fieldHandler) + .SetException(exception) .Build(); public static IError ProjectionProvider_CouldNotProjectFiltering(IValueNode node) => diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Extensions/FilterConventionDescriptorQueryableExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Extensions/FilterConventionDescriptorQueryableExtensions.cs index 5e0b79a6242..20feaba1905 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Extensions/FilterConventionDescriptorQueryableExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Extensions/FilterConventionDescriptorQueryableExtensions.cs @@ -22,45 +22,45 @@ public static IFilterConventionDescriptor UseQueryableProvider( public static IFilterProviderDescriptor AddDefaultFieldHandlers( this IFilterProviderDescriptor descriptor) { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableBooleanEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableBooleanNotEqualsHandler.Create); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableComparableEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableComparableNotEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableComparableInHandler.Create); + descriptor.AddFieldHandler(QueryableComparableNotInHandler.Create); + descriptor.AddFieldHandler(QueryableComparableGreaterThanHandler.Create); + descriptor.AddFieldHandler(QueryableComparableNotGreaterThanHandler.Create); + descriptor.AddFieldHandler(QueryableComparableGreaterThanOrEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableComparableNotGreaterThanOrEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableComparableLowerThanHandler.Create); + descriptor.AddFieldHandler(QueryableComparableNotLowerThanHandler.Create); + descriptor.AddFieldHandler(QueryableComparableLowerThanOrEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableComparableNotLowerThanOrEqualsHandler.Create); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableStringNotEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableStringStartsWithHandler.Create); + descriptor.AddFieldHandler(QueryableStringNotStartsWithHandler.Create); + descriptor.AddFieldHandler(QueryableStringEndsWithHandler.Create); + descriptor.AddFieldHandler(QueryableStringNotEndsWithHandler.Create); + descriptor.AddFieldHandler(QueryableStringInHandler.Create); + descriptor.AddFieldHandler(QueryableStringNotInHandler.Create); + descriptor.AddFieldHandler(QueryableStringContainsHandler.Create); + descriptor.AddFieldHandler(QueryableStringNotContainsHandler.Create); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableEnumEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableEnumNotEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableEnumInHandler.Create); + descriptor.AddFieldHandler(QueryableEnumNotInHandler.Create); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableListAnyOperationHandler.Create); + descriptor.AddFieldHandler(QueryableListAllOperationHandler.Create); + descriptor.AddFieldHandler(QueryableListNoneOperationHandler.Create); + descriptor.AddFieldHandler(QueryableListSomeOperationHandler.Create); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableDataOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); return descriptor; } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs index 6bcb7f2f87c..fd514bfc847 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanEqualsHandler.cs @@ -23,4 +23,6 @@ public override Expression HandleOperation( var property = context.GetInstance(); return FilterExpressionBuilder.Equals(property, parsedValue); } + + public static QueryableBooleanEqualsHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs index a61e8612bda..b4b67941817 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Boolean/QueryableBooleanNotEqualsHandler.cs @@ -23,4 +23,6 @@ public override Expression HandleOperation( var property = context.GetInstance(); return FilterExpressionBuilder.NotEquals(property, parsedValue); } + + public static QueryableBooleanNotEqualsHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableEqualsHandler.cs index f0cd320e45a..448079df7b4 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableEqualsHandler.cs @@ -27,4 +27,7 @@ public override Expression HandleOperation( parsedValue = ParseValue(value, parsedValue, field.Type, context); return FilterExpressionBuilder.Equals(property, parsedValue); } + + public static QueryableComparableEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanHandler.cs index b1e61dcb971..39cbd707e9a 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanHandler.cs @@ -34,4 +34,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.GreaterThan(property, parsedValue); } + + public static QueryableComparableGreaterThanHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanOrEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanOrEqualsHandler.cs index 13843e0e404..8c19ad04db5 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanOrEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableGreaterThanOrEqualsHandler.cs @@ -36,4 +36,7 @@ public override Expression HandleOperation( property, parsedValue); } + + public static QueryableComparableGreaterThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableInHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableInHandler.cs index 07da823c984..e51b13d7709 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableInHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableInHandler.cs @@ -37,4 +37,7 @@ public override Expression HandleOperation( context.RuntimeTypes.Peek().Source, parsedValue); } + + public static QueryableComparableInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanHandler.cs index eb6a4522ec0..aa79b179df0 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanHandler.cs @@ -34,4 +34,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.LowerThan(property, parsedValue); } + + public static QueryableComparableLowerThanHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanOrEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanOrEqualsHandler.cs index 38f857bb20f..4e5ac1e657f 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanOrEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableLowerThanOrEqualsHandler.cs @@ -34,4 +34,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.LowerThanOrEqual(property, parsedValue); } + + public static QueryableComparableLowerThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotEqualsHandler.cs index 53d05b3bcb8..c3b7d879f03 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotEqualsHandler.cs @@ -27,4 +27,7 @@ public override Expression HandleOperation( parsedValue = ParseValue(value, parsedValue, field.Type, context); return FilterExpressionBuilder.NotEquals(property, parsedValue); } + + public static QueryableComparableNotEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanHandler.cs index a9742c4085a..96029322426 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanHandler.cs @@ -35,4 +35,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Not( FilterExpressionBuilder.GreaterThan(property, parsedValue)); } + + public static QueryableComparableNotGreaterThanHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanOrEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanOrEqualsHandler.cs index b0adbc4da71..d8795824862 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanOrEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotGreaterThanOrEqualsHandler.cs @@ -35,4 +35,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Not( FilterExpressionBuilder.GreaterThanOrEqual(property, parsedValue)); } + + public static QueryableComparableNotGreaterThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotInHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotInHandler.cs index b2c3a77d31f..4dc1bbb40e7 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotInHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotInHandler.cs @@ -38,4 +38,7 @@ public override Expression HandleOperation( context.RuntimeTypes.Peek().Source, parsedValue)); } + + public static QueryableComparableNotInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanHandler.cs index 8cee679bbcb..2706d90e6d4 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanHandler.cs @@ -34,4 +34,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Not( FilterExpressionBuilder.LowerThan(property, parsedValue)); } + + public static QueryableComparableNotLowerThanHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanOrEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanOrEqualsHandler.cs index 9a7357a8646..bd22ac3eff7 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanOrEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Comparable/QueryableComparableNotLowerThanOrEqualsHandler.cs @@ -35,4 +35,7 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Not( FilterExpressionBuilder.LowerThanOrEqual(property, parsedValue)); } + + public static QueryableComparableNotLowerThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumEqualsHandler.cs index bd3cae3684e..4dd8e9e1143 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumEqualsHandler.cs @@ -23,4 +23,7 @@ public override bool CanHandle( && fieldConfiguration is FilterOperationFieldConfiguration operationField && operationField.Id == Operation; } + + public new static QueryableEnumEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumInHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumInHandler.cs index 967a7a6c33f..17837b68fe8 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumInHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumInHandler.cs @@ -23,4 +23,7 @@ public override bool CanHandle( && fieldConfiguration is FilterOperationFieldConfiguration operationField && operationField.Id == Operation; } + + public new static QueryableEnumInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotEqualsHandler.cs index 7a231e62299..0c9072f04ef 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotEqualsHandler.cs @@ -23,4 +23,7 @@ public override bool CanHandle( && fieldConfiguration is FilterOperationFieldConfiguration operationField && operationField.Id == Operation; } + + public new static QueryableEnumNotEqualsHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotInHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotInHandler.cs index d66db53b6e0..2583f64c17c 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotInHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/Enum/QueryableEnumNotInHandler.cs @@ -23,4 +23,7 @@ public override bool CanHandle( && fieldConfiguration is FilterOperationFieldConfiguration operationField && operationField.Id == Operation; } + + public new static QueryableEnumNotInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAllOperationHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAllOperationHandler.cs index bd3afbf8907..34b53098834 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAllOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAllOperationHandler.cs @@ -14,4 +14,6 @@ protected override Expression HandleListOperation( Type closureType, LambdaExpression lambda) => FilterExpressionBuilder.All(closureType, context.GetInstance(), lambda); + + public static QueryableListAllOperationHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAnyOperationHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAnyOperationHandler.cs index 1d2ea8a17f7..d953cf50c18 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAnyOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListAnyOperationHandler.cs @@ -63,4 +63,7 @@ public override Expression HandleOperation( throw ThrowHelper.Filtering_CouldNotParseValue(this, value, field.Type, field); } + + public static QueryableListAnyOperationHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListNoneOperationHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListNoneOperationHandler.cs index a799fabd917..672f314859b 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListNoneOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListNoneOperationHandler.cs @@ -15,4 +15,6 @@ protected override Expression HandleListOperation( LambdaExpression lambda) => FilterExpressionBuilder.Not( FilterExpressionBuilder.Any(closureType, context.GetInstance(), lambda)); + + public static QueryableListNoneOperationHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListSomeOperationHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListSomeOperationHandler.cs index bde9f9a79c0..dc3812363e5 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListSomeOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/List/QueryableListSomeOperationHandler.cs @@ -14,4 +14,6 @@ protected override Expression HandleListOperation( Type closureType, LambdaExpression lambda) => FilterExpressionBuilder.Any(closureType, context.GetInstance(), lambda); + + public static QueryableListSomeOperationHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDataOperationHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDataOperationHandler.cs index 52444c85b14..0ac4857a713 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDataOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDataOperationHandler.cs @@ -16,4 +16,6 @@ public override bool CanHandle( return fieldConfiguration is FilterOperationFieldConfiguration def && def.Id == Operation; } + + public static QueryableDataOperationHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDefaultFieldHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDefaultFieldHandler.cs index 8280de45a50..72d1d84fa3b 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDefaultFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/QueryableDefaultFieldHandler.cs @@ -146,6 +146,8 @@ public override bool TryHandleLeave( return true; } + public static QueryableDefaultFieldHandler Create(FilterProviderContext context) => new(); + private sealed class ReplaceVariableExpressionVisitor : ExpressionVisitor { private readonly Expression _replacement; diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringContainsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringContainsHandler.cs index 622ff3afd27..a439ea16c31 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringContainsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringContainsHandler.cs @@ -29,4 +29,6 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Contains(property, parsedValue); } + + public static QueryableStringContainsHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEndsWithHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEndsWithHandler.cs index 93ff5a1aa6b..558eedea1b7 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEndsWithHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEndsWithHandler.cs @@ -28,4 +28,6 @@ public override Expression HandleOperation( return FilterExpressionBuilder.EndsWith(property, parsedValue); } + + public static QueryableStringEndsWithHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEqualsHandler.cs index b9682c4c2c6..c65cde33680 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringEqualsHandler.cs @@ -21,4 +21,6 @@ public override Expression HandleOperation( var property = context.GetInstance(); return FilterExpressionBuilder.Equals(property, parsedValue); } + + public static QueryableStringEqualsHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringInHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringInHandler.cs index 1a80426e505..294c46034fd 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringInHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringInHandler.cs @@ -25,4 +25,6 @@ public override Expression HandleOperation( context.RuntimeTypes.Peek().Source, parsedValue); } + + public static QueryableStringInHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotContainsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotContainsHandler.cs index b383b30dba4..3b6268830c6 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotContainsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotContainsHandler.cs @@ -28,4 +28,6 @@ public override Expression HandleOperation( return FilterExpressionBuilder.NotContains(property, parsedValue); } + + public static QueryableStringNotContainsHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEndsWithHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEndsWithHandler.cs index 0e80ee11f21..e58cce352c4 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEndsWithHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEndsWithHandler.cs @@ -29,4 +29,6 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Not( FilterExpressionBuilder.EndsWith(property, parsedValue)); } + + public static QueryableStringNotEndsWithHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEqualsHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEqualsHandler.cs index 19601180de9..32bb6274f37 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEqualsHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotEqualsHandler.cs @@ -21,4 +21,6 @@ public override Expression HandleOperation( var property = context.GetInstance(); return FilterExpressionBuilder.NotEquals(property, parsedValue); } + + public static QueryableStringNotEqualsHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotInHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotInHandler.cs index 838c44ca347..aa29092ba55 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotInHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotInHandler.cs @@ -26,4 +26,6 @@ public override Expression HandleOperation( context.RuntimeTypes.Peek().Source, parsedValue)); } + + public static QueryableStringNotInHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotStartsWithHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotStartsWithHandler.cs index c6f5570b4fd..089ca11a5f9 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotStartsWithHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringNotStartsWithHandler.cs @@ -28,4 +28,6 @@ public override Expression HandleOperation( return FilterExpressionBuilder.Not( FilterExpressionBuilder.StartsWith(property, parsedValue)); } + + public static QueryableStringNotStartsWithHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringStartsWithHandler.cs b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringStartsWithHandler.cs index e00a4d21055..1a4c301a224 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringStartsWithHandler.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Expressions/Handlers/String/QueryableStringStartsWithHandler.cs @@ -28,4 +28,6 @@ public override Expression HandleOperation( return FilterExpressionBuilder.StartsWith(property, parsedValue); } + + public static QueryableStringStartsWithHandler Create(FilterProviderContext context) => new(context.InputParser); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterFieldHandlerConfiguration.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterFieldHandlerConfiguration.cs new file mode 100644 index 00000000000..8794d4339e2 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterFieldHandlerConfiguration.cs @@ -0,0 +1,49 @@ +namespace HotChocolate.Data.Filters; + +public readonly struct FilterFieldHandlerConfiguration +{ + private readonly Func? _factory; + private readonly IFilterFieldHandler? _instance; + + public FilterFieldHandlerConfiguration(IFilterFieldHandler instance) + { + _instance = instance; + } + + public FilterFieldHandlerConfiguration(Func factory) + { + _factory = factory; + } + + public IFilterFieldHandler? Instance => _instance; + + public IFilterFieldHandler Create(FilterProviderContext context) + where TContext : IFilterVisitorContext + { + if (_instance is not null) + { + if (_instance is not IFilterFieldHandler handler) + { + throw new InvalidOperationException( + $"Expected handler to be of type IFilterFieldHandler<{typeof(TContext).Name}>"); + } + + return handler; + } + + if (_factory is null) + { + throw new InvalidOperationException("Expected to have either a factory or an instance."); + } + + var instance = _factory(context); + + if (instance is not IFilterFieldHandler casted) + { + throw new InvalidOperationException( + $"Expected handler to be of type IFilterFieldHandler<{typeof(TContext).Name}>"); + } + + return casted; + } +} diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProvider.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProvider.cs index c72c27c2b14..fbfbe2e4b66 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProvider.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProvider.cs @@ -1,8 +1,6 @@ using HotChocolate.Configuration; using HotChocolate.Types; using HotChocolate.Types.Descriptors; -using HotChocolate.Utilities; -using Microsoft.Extensions.DependencyInjection; using static HotChocolate.Data.DataResources; using static HotChocolate.Data.ThrowHelper; @@ -15,8 +13,8 @@ namespace HotChocolate.Data.Filters; /// The type of the context public abstract class FilterProvider : Convention - , IFilterProvider - , IFilterProviderConvention + , IFilterProvider + , IFilterProviderConvention where TContext : IFilterVisitorContext { private readonly List> _fieldHandlers = []; @@ -70,7 +68,7 @@ void IFilterProviderConvention.Complete(IConventionContext context) /// protected internal override void Complete(IConventionContext context) { - if (Configuration!.Handlers.Count == 0) + if (Configuration!.FieldHandlerConfigurations.Count == 0) { throw FilterProvider_NoHandlersConfigured(this); } @@ -82,34 +80,29 @@ protected internal override void Complete(IConventionContext context) context.Scope); } - var services = new CombinedServiceProvider( - new DictionaryServiceProvider( - (typeof(IFilterProvider), this), - (typeof(IConventionContext), context), - (typeof(IDescriptorContext), context.DescriptorContext), - (typeof(IFilterConvention), _filterConvention), - (typeof(ITypeConverter), context.DescriptorContext.TypeConverter), - (typeof(InputParser), context.DescriptorContext.InputParser), - (typeof(InputFormatter), context.DescriptorContext.InputFormatter), - (typeof(ITypeInspector), context.DescriptorContext.TypeInspector)), - context.Services); - - foreach (var (type, instance) in Configuration.Handlers) + var providerContext = new FilterProviderContext( + context.Services, + this, + context, + context.DescriptorContext, + _filterConvention, + context.DescriptorContext.TypeConverter, + context.DescriptorContext.TypeInspector, + context.DescriptorContext.InputParser, + context.DescriptorContext.InputFormatter + ); + + foreach (var handlerConfiguration in Configuration.FieldHandlerConfigurations) { - if (instance is IFilterFieldHandler casted) - { - _fieldHandlers.Add(casted); - continue; - } - try { - var optimizers = (IFilterFieldHandler)ActivatorUtilities.GetServiceOrCreateInstance(services, type); - _fieldHandlers.Add(optimizers); + var handler = handlerConfiguration.Create(providerContext); + + _fieldHandlers.Add(handler); } - catch + catch (Exception exception) { - throw FilterProvider_UnableToCreateFieldHandler(this, type); + throw FilterProvider_UnableToCreateFieldHandler(this, exception); } } } diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderConfiguration.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderConfiguration.cs index f92f60991e8..953e84c0cf3 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderConfiguration.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderConfiguration.cs @@ -2,5 +2,5 @@ namespace HotChocolate.Data.Filters; public class FilterProviderConfiguration { - public IList<(Type Handler, IFilterFieldHandler? HandlerInstance)> Handlers { get; } = []; + public IList FieldHandlerConfigurations { get; } = []; } diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderContext.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderContext.cs new file mode 100644 index 00000000000..aaf796a2c9e --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderContext.cs @@ -0,0 +1,36 @@ +using HotChocolate.Types; +using HotChocolate.Types.Descriptors; +using HotChocolate.Utilities; + +namespace HotChocolate.Data.Filters; + +public readonly struct FilterProviderContext( + IServiceProvider schemaServices, + IFilterProvider filterProvider, + IConventionContext conventionContext, + IDescriptorContext descriptorContext, + IFilterConvention filterConvention, + ITypeConverter typeConverter, + ITypeInspector typeInspector, + InputParser inputParser, + InputFormatter inputFormatter) + +{ + public IServiceProvider SchemaServices { get; } = schemaServices; + + public IFilterProvider FilterProvider { get; } = filterProvider; + + public IConventionContext ConventionContext { get; } = conventionContext; + + public IDescriptorContext DescriptorContext { get; } = descriptorContext; + + public IFilterConvention FilterConvention { get; } = filterConvention; + + public ITypeConverter TypeConverter { get; } = typeConverter; + + public ITypeInspector TypeInspector { get; } = typeInspector; + + public InputParser InputParser { get; } = inputParser; + + public InputFormatter InputFormatter { get; } = inputFormatter; +} diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderDescriptor.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderDescriptor.cs index aa3e685f377..520ffefde62 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderDescriptor.cs @@ -12,10 +12,11 @@ protected FilterProviderDescriptor() public FilterProviderConfiguration CreateConfiguration() => Configuration; - public IFilterProviderDescriptor AddFieldHandler() + public IFilterProviderDescriptor AddFieldHandler( + Func factory) where TFieldHandler : IFilterFieldHandler { - Configuration.Handlers.Add((typeof(TFieldHandler), null)); + Configuration.FieldHandlerConfigurations.Add(new FilterFieldHandlerConfiguration(ctx => factory(ctx))); return this; } @@ -23,10 +24,9 @@ public IFilterProviderDescriptor AddFieldHandler( TFieldHandler fieldHandler) where TFieldHandler : IFilterFieldHandler { - Configuration.Handlers.Add((typeof(TFieldHandler), fieldHandler)); + Configuration.FieldHandlerConfigurations.Add(new FilterFieldHandlerConfiguration(fieldHandler)); return this; } - public static FilterProviderDescriptor New() => - new FilterProviderDescriptor(); + public static FilterProviderDescriptor New() => new(); } diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderExtensions.cs index 0cdb5461e9b..d621be47619 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/FilterProviderExtensions.cs @@ -60,9 +60,9 @@ public override void Merge(IConventionContext context, Convention convention) // Provider extensions should be applied by default before the default handlers, as // the interceptor picks up the first handler. A provider extension should adds more // specific handlers than the default providers - for (var i = Configuration.Handlers.Count - 1; i >= 0; i--) + for (var i = Configuration.FieldHandlerConfigurations.Count - 1; i >= 0; i--) { - target.Handlers.Insert(0, Configuration.Handlers[i]); + target.FieldHandlerConfigurations.Insert(0, Configuration.FieldHandlerConfigurations[i]); } } } diff --git a/src/HotChocolate/Data/src/Data/Filters/Visitor/IFilterProviderDescriptor.cs b/src/HotChocolate/Data/src/Data/Filters/Visitor/IFilterProviderDescriptor.cs index f9a3055214c..b784d38a09f 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Visitor/IFilterProviderDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Visitor/IFilterProviderDescriptor.cs @@ -10,7 +10,8 @@ public interface IFilterProviderDescriptor : IFluent /// /// The type of the field handler /// The descriptor that this methods was called on - IFilterProviderDescriptor AddFieldHandler() + IFilterProviderDescriptor AddFieldHandler( + Func factory) where TFieldHandler : IFilterFieldHandler; /// diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs index 50e0e60cd29..536e7fa6047 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs @@ -15,19 +15,19 @@ public static IProjectionProviderDescriptor RegisterQueryableHandler( { ArgumentNullException.ThrowIfNull(descriptor); - descriptor.RegisterFieldHandler(); - descriptor.RegisterFieldHandler(); - descriptor.RegisterFieldHandler(); + descriptor.RegisterFieldHandler(QueryableProjectionScalarHandler.Create); + descriptor.RegisterFieldHandler(QueryableProjectionListHandler.Create); + descriptor.RegisterFieldHandler(QueryableProjectionFieldHandler.Create); - descriptor.RegisterFieldInterceptor(); - descriptor.RegisterFieldInterceptor(); - descriptor.RegisterFieldInterceptor(); - descriptor.RegisterFieldInterceptor(); + descriptor.RegisterFieldInterceptor(QueryableFilterInterceptor.Create); + descriptor.RegisterFieldInterceptor(QueryableSortInterceptor.Create); + descriptor.RegisterFieldInterceptor(QueryableFirstOrDefaultInterceptor.Create); + descriptor.RegisterFieldInterceptor(QueryableSingleOrDefaultInterceptor.Create); - descriptor.RegisterOptimizer(); - descriptor.RegisterOptimizer(); - descriptor.RegisterOptimizer(); - descriptor.RegisterOptimizer(); + descriptor.RegisterOptimizer(IsProjectedProjectionOptimizer.Create); + descriptor.RegisterOptimizer(QueryablePagingProjectionOptimizer.Create); + descriptor.RegisterOptimizer(QueryableFilterProjectionOptimizer.Create); + descriptor.RegisterOptimizer(QueryableSortProjectionOptimizer.Create); return descriptor; } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionProviderDescriptor.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionProviderDescriptor.cs index 8fa5092b8d9..973ecac6ab0 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionProviderDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionProviderDescriptor.cs @@ -12,7 +12,8 @@ public interface IProjectionProviderDescriptor /// /// The type of the field handler /// The descriptor that this methods was called on - IProjectionProviderDescriptor RegisterFieldHandler() + IProjectionProviderDescriptor RegisterFieldHandler( + Func factory) where THandler : IProjectionFieldHandler; /// @@ -31,7 +32,8 @@ IProjectionProviderDescriptor RegisterFieldHandler(THandler handler) /// /// The type of the field interceptor /// The descriptor that this methods was called on - IProjectionProviderDescriptor RegisterFieldInterceptor() + IProjectionProviderDescriptor RegisterFieldInterceptor( + Func factory) where THandler : IProjectionFieldInterceptor; /// @@ -52,7 +54,8 @@ IProjectionProviderDescriptor RegisterFieldInterceptor(THandler handle /// /// The type of the field optimizer /// The descriptor that this methods was called on - IProjectionProviderDescriptor RegisterOptimizer() + IProjectionProviderDescriptor RegisterOptimizer( + Func factory) where THandler : IProjectionOptimizer; /// diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionFieldHandlerConfiguration.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionFieldHandlerConfiguration.cs new file mode 100644 index 00000000000..cbb642a5318 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionFieldHandlerConfiguration.cs @@ -0,0 +1,32 @@ +namespace HotChocolate.Data.Projections; + +public readonly struct ProjectionFieldHandlerConfiguration +{ + private readonly Func? _factory; + private readonly IProjectionFieldHandler? _instance; + + public ProjectionFieldHandlerConfiguration(IProjectionFieldHandler instance) + { + _instance = instance; + } + + public ProjectionFieldHandlerConfiguration(Func factory) + { + _factory = factory; + } + + public IProjectionFieldHandler Create(ProjectionProviderContext context) + { + if (_instance is not null) + { + return _instance; + } + + if (_factory is null) + { + throw new InvalidOperationException("Expected to have either a factory or an instance."); + } + + return _factory(context); + } +} diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionFieldInterceptorConfiguration.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionFieldInterceptorConfiguration.cs new file mode 100644 index 00000000000..f2004bd5c6e --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionFieldInterceptorConfiguration.cs @@ -0,0 +1,32 @@ +namespace HotChocolate.Data.Projections; + +public readonly struct ProjectionFieldInterceptorConfiguration +{ + private readonly Func? _factory; + private readonly IProjectionFieldInterceptor? _instance; + + public ProjectionFieldInterceptorConfiguration(IProjectionFieldInterceptor instance) + { + _instance = instance; + } + + public ProjectionFieldInterceptorConfiguration(Func factory) + { + _factory = factory; + } + + public IProjectionFieldInterceptor Create(ProjectionProviderContext context) + { + if (_instance is not null) + { + return _instance; + } + + if (_factory is null) + { + throw new InvalidOperationException("Expected to have either a factory or an instance."); + } + + return _factory(context); + } +} diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionOptimizerConfiguration.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionOptimizerConfiguration.cs new file mode 100644 index 00000000000..4b79ede4e30 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionOptimizerConfiguration.cs @@ -0,0 +1,32 @@ +namespace HotChocolate.Data.Projections; + +public readonly struct ProjectionOptimizerConfiguration +{ + private readonly Func? _factory; + private readonly IProjectionOptimizer? _instance; + + public ProjectionOptimizerConfiguration(IProjectionOptimizer instance) + { + _instance = instance; + } + + public ProjectionOptimizerConfiguration(Func factory) + { + _factory = factory; + } + + public IProjectionOptimizer Create(ProjectionProviderContext context) + { + if (_instance is not null) + { + return _instance; + } + + if (_factory is null) + { + throw new InvalidOperationException("Expected to have either a factory or an instance."); + } + + return _factory(context); + } +} diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs index 313d2c925d7..f74cea5be9d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs @@ -1,10 +1,7 @@ using HotChocolate.Execution.Processing; using HotChocolate.Types.Descriptors; -using HotChocolate.Utilities; using static HotChocolate.Data.DataResources; -using static HotChocolate.Data.ErrorHelper; using static HotChocolate.Data.ThrowHelper; -using static Microsoft.Extensions.DependencyInjection.ActivatorUtilities; namespace HotChocolate.Data.Projections; @@ -20,7 +17,7 @@ public abstract class ProjectionProvider private Action? _configure; private readonly IList _fieldHandlers = []; private readonly IList _fieldInterceptors = []; - private readonly IList _optimizer = []; + private readonly IList _optimizers = []; protected ProjectionProvider() { @@ -74,75 +71,59 @@ void IProjectionProviderConvention.Complete(IConventionContext context) protected internal override void Complete(IConventionContext context) { - if (Configuration!.Handlers.Count == 0) + if (Configuration!.FieldHandlerConfigurations.Count == 0) { throw ProjectionProvider_NoHandlersConfigured(this); } - var services = new CombinedServiceProvider( - new DictionaryServiceProvider( - (typeof(IConventionContext), context), - (typeof(IDescriptorContext), context.DescriptorContext), - (typeof(ITypeInspector), context.DescriptorContext.TypeInspector)), - context.Services); + var providerContext = new ProjectionProviderContext( + context.Services, + context, + context.DescriptorContext, + context.DescriptorContext.TypeInspector); - foreach (var (type, instance) in Configuration.Handlers) + foreach (var handlerConfiguration in Configuration.FieldHandlerConfigurations) { - if (instance is not null) - { - _fieldHandlers.Add(instance); - continue; - } - try { - var field = (IProjectionFieldHandler)GetServiceOrCreateInstance(services, type); - _fieldHandlers.Add(field); + var handler = handlerConfiguration.Create(providerContext); + + _fieldHandlers.Add(handler); } - catch + catch (Exception exception) { throw new SchemaException( - ProjectionConvention_UnableToCreateFieldHandler(this, type)); + ErrorHelper.ProjectionConvention_UnableToCreateFieldHandler(this, exception)); } } - foreach (var (type, instance) in Configuration.Interceptors) + foreach (var interceptorConfiguration in Configuration.FieldInterceptorConfigurations) { - if (instance is not null) - { - _fieldInterceptors.Add(instance); - continue; - } - try { - var field = (IProjectionFieldInterceptor)GetServiceOrCreateInstance(services, type); - _fieldInterceptors.Add(field); + var interceptor = interceptorConfiguration.Create(providerContext); + + _fieldInterceptors.Add(interceptor); } - catch + catch (Exception exception) { throw new SchemaException( - ProjectionConvention_UnableToCreateFieldHandler(this, type)); + ErrorHelper.ProjectionConvention_UnableToCreateFieldHandler(this, exception)); } } - foreach (var (type, instance) in Configuration.Optimizers) + foreach (var optimizerConfiguration in Configuration.OptimizerConfigurations) { - if (instance is not null) - { - _optimizer.Add(instance); - continue; - } - try { - var optimizers = (IProjectionOptimizer)GetServiceOrCreateInstance(services, type); - _optimizer.Add(optimizers); + var optimizer = optimizerConfiguration.Create(providerContext); + + _optimizers.Add(optimizer); } - catch + catch (Exception exception) { throw new SchemaException( - ProjectionConvention_UnableToCreateFieldHandler(this, type)); + ErrorHelper.ProjectionConvention_UnableToCreateFieldHandler(this, exception)); } } } @@ -151,11 +132,11 @@ public Selection RewriteSelection( SelectionSetOptimizerContext context, Selection selection) { - for (var i = 0; i < _optimizer.Count; i++) + for (var i = 0; i < _optimizers.Count; i++) { - if (_optimizer[i].CanHandle(selection)) + if (_optimizers[i].CanHandle(selection)) { - selection = _optimizer[i].RewriteSelection(context, selection); + selection = _optimizers[i].RewriteSelection(context, selection); } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderConfiguration.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderConfiguration.cs index 43a81a1a8e0..2af68af9a64 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderConfiguration.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderConfiguration.cs @@ -6,9 +6,9 @@ public class ProjectionProviderConfiguration : IHasScope { public string? Scope { get; set; } - public IList<(Type, IProjectionFieldHandler?)> Handlers { get; } = []; + public IList FieldHandlerConfigurations { get; } = []; - public IList<(Type, IProjectionFieldInterceptor?)> Interceptors { get; } = []; + public IList FieldInterceptorConfigurations { get; } = []; - public IList<(Type, IProjectionOptimizer?)> Optimizers { get; } = []; + public IList OptimizerConfigurations { get; } = []; } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderContext.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderContext.cs new file mode 100644 index 00000000000..7f88f5e4ed3 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderContext.cs @@ -0,0 +1,18 @@ +using HotChocolate.Types.Descriptors; + +namespace HotChocolate.Data.Projections; + +public readonly struct ProjectionProviderContext( + IServiceProvider schemaServices, + IConventionContext conventionContext, + IDescriptorContext descriptorContext, + ITypeInspector iTypeInspector) +{ + public IServiceProvider SchemaServices { get; } = schemaServices; + + public IConventionContext ConventionContext { get; } = conventionContext; + + public IDescriptorContext DescriptorContext { get; } = descriptorContext; + + public ITypeInspector ITypeInspector { get; } = iTypeInspector; +} diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderDescriptor.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderDescriptor.cs index 2ccec893b49..ef3eeacacb3 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderDescriptor.cs @@ -2,8 +2,7 @@ namespace HotChocolate.Data.Projections; -public class ProjectionProviderDescriptor - : IProjectionProviderDescriptor +public class ProjectionProviderDescriptor : IProjectionProviderDescriptor { protected ProjectionProviderDescriptor(IDescriptorContext context, string? scope) { @@ -18,10 +17,11 @@ protected ProjectionProviderDescriptor(IDescriptorContext context, string? scope public ProjectionProviderConfiguration CreateConfiguration() => Configuration; /// - public IProjectionProviderDescriptor RegisterFieldHandler() + public IProjectionProviderDescriptor RegisterFieldHandler( + Func factory) where THandler : IProjectionFieldHandler { - Configuration.Handlers.Add((typeof(THandler), null)); + Configuration.FieldHandlerConfigurations.Add(new ProjectionFieldHandlerConfiguration(ctx => factory(ctx))); return this; } @@ -29,15 +29,16 @@ public IProjectionProviderDescriptor RegisterFieldHandler() public IProjectionProviderDescriptor RegisterFieldHandler(THandler handler) where THandler : IProjectionFieldHandler { - Configuration.Handlers.Add((typeof(THandler), handler)); + Configuration.FieldHandlerConfigurations.Add(new ProjectionFieldHandlerConfiguration(handler)); return this; } /// - public IProjectionProviderDescriptor RegisterFieldInterceptor() + public IProjectionProviderDescriptor RegisterFieldInterceptor( + Func factory) where THandler : IProjectionFieldInterceptor { - Configuration.Interceptors.Add((typeof(THandler), null)); + Configuration.FieldInterceptorConfigurations.Add(new ProjectionFieldInterceptorConfiguration(ctx => factory(ctx))); return this; } @@ -45,15 +46,16 @@ public IProjectionProviderDescriptor RegisterFieldInterceptor() public IProjectionProviderDescriptor RegisterFieldInterceptor(THandler handler) where THandler : IProjectionFieldInterceptor { - Configuration.Interceptors.Add((typeof(THandler), handler)); + Configuration.FieldInterceptorConfigurations.Add(new ProjectionFieldInterceptorConfiguration(handler)); return this; } /// - public IProjectionProviderDescriptor RegisterOptimizer() + public IProjectionProviderDescriptor RegisterOptimizer( + Func factory) where THandler : IProjectionOptimizer { - Configuration.Optimizers.Add((typeof(THandler), null)); + Configuration.OptimizerConfigurations.Add(new ProjectionOptimizerConfiguration(ctx => factory(ctx))); return this; } @@ -61,7 +63,7 @@ public IProjectionProviderDescriptor RegisterOptimizer() public IProjectionProviderDescriptor RegisterOptimizer(THandler handler) where THandler : IProjectionOptimizer { - Configuration.Optimizers.Add((typeof(THandler), handler)); + Configuration.OptimizerConfigurations.Add(new ProjectionOptimizerConfiguration(handler)); return this; } @@ -73,5 +75,5 @@ public IProjectionProviderDescriptor RegisterOptimizer(THandler handle public static ProjectionProviderDescriptor New( IDescriptorContext context, string? scope) => - new ProjectionProviderDescriptor(context, scope); + new(context, scope); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderExtension.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderExtension.cs index 260a2fd51e5..dbda812b0d2 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderExtension.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProviderExtension.cs @@ -59,9 +59,9 @@ public override void Merge(IConventionContext context, Convention convention) // Provider extensions should be applied by default before the default handlers, as // the interceptor picks up the first handler. A provider extension should adds more // specific handlers than the default providers - for (var i = Configuration.Handlers.Count - 1; i >= 0; i--) + for (var i = Configuration.FieldHandlerConfigurations.Count - 1; i >= 0; i--) { - target.Handlers.Insert(0, Configuration.Handlers[i]); + target.FieldHandlerConfigurations.Insert(0, Configuration.FieldHandlerConfigurations[i]); } } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs index daf873ceec6..4851a43e156 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs @@ -106,4 +106,6 @@ public override bool TryHandleLeave( return true; } + + public static QueryableProjectionFieldHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs index 576dbb8ddfa..b2bd688a0b9 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs @@ -100,4 +100,6 @@ public override bool TryHandleLeave( return true; } + + public static QueryableProjectionListHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs index 3d0dccb38de..7d5be358f91 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs @@ -53,4 +53,6 @@ public override bool TryHandleLeave( action = SelectionVisitor.Skip; return true; } + + public static QueryableProjectionScalarHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs index a563271b0a3..3fba65b481a 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs @@ -67,4 +67,6 @@ public void BeforeProjection( public void AfterProjection(QueryableProjectionContext context, ISelection selection) { } + + public static QueryableFilterInterceptor Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFirstOrDefaultInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFirstOrDefaultInterceptor.cs index e6ba91cef18..8fd3d0c6a8a 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFirstOrDefaultInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFirstOrDefaultInterceptor.cs @@ -7,4 +7,6 @@ public QueryableFirstOrDefaultInterceptor() : base(SelectionFlags.FirstOrDefault, 1) { } + + public static QueryableFirstOrDefaultInterceptor Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSingleOrDefaultInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSingleOrDefaultInterceptor.cs index 3043efb229e..28e8c5982bc 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSingleOrDefaultInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSingleOrDefaultInterceptor.cs @@ -8,4 +8,6 @@ public QueryableSingleOrDefaultInterceptor() : base(SelectionFlags.SingleOrDefault, 2) { } + + public static QueryableSingleOrDefaultInterceptor Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs index b75dad92e40..3898b8ac62a 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs @@ -54,4 +54,6 @@ public void BeforeProjection( public void AfterProjection(QueryableProjectionContext context, ISelection selection) { } + + public static QueryableSortInterceptor Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs index 5b91591cac5..59bfd237377 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs @@ -32,4 +32,6 @@ static FieldDelegate WrappedPipeline(FieldDelegate next) => return selection; } + + public static QueryableFilterProjectionOptimizer Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs index a3aa58195d7..9182d19349d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs @@ -167,4 +167,6 @@ private static void CollectSelectionOfNodes( n => n.Kind is SyntaxKind.SelectionSet ? new SelectionSetNode(((SelectionSetNode)n).Selections) : n); + + public static QueryablePagingProjectionOptimizer Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs index 75537cbf40e..c242f3373cb 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs @@ -31,4 +31,6 @@ static FieldDelegate WrappedPipeline(FieldDelegate next) return selection; } + + public static QueryableSortProjectionOptimizer Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs index 3655844a79d..4739c744624 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs @@ -66,4 +66,6 @@ public Selection RewriteSelection( return selection; } + + public static IsProjectedProjectionOptimizer Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Extensions/SortConventionDescriptorQueryableExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Extensions/SortConventionDescriptorQueryableExtensions.cs index c24f8987e52..673a12240a4 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Extensions/SortConventionDescriptorQueryableExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Extensions/SortConventionDescriptorQueryableExtensions.cs @@ -12,9 +12,9 @@ public static ISortConventionDescriptor UseQueryableProvider( public static ISortProviderDescriptor AddDefaultFieldHandlers( this ISortProviderDescriptor descriptor) { - descriptor.AddOperationHandler(); - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddOperationHandler(QueryableDescendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); return descriptor; } } diff --git a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableAscendingSortOperationHandler.cs b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableAscendingSortOperationHandler.cs index f79b94a4152..4efecd24f23 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableAscendingSortOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableAscendingSortOperationHandler.cs @@ -17,6 +17,8 @@ protected override QueryableSortOperation HandleOperation( return AscendingSortOperation.From(fieldSelector); } + public static QueryableAscendingSortOperationHandler Create(SortProviderContext context) => new(); + private sealed class AscendingSortOperation : QueryableSortOperation { private AscendingSortOperation(QueryableFieldSelector fieldSelector) diff --git a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDefaultSortFieldHandler.cs b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDefaultSortFieldHandler.cs index cf08b72a441..74905f284d5 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDefaultSortFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDefaultSortFieldHandler.cs @@ -102,6 +102,8 @@ public override bool TryHandleLeave( return true; } + public static QueryableDefaultSortFieldHandler Create(SortProviderContext context) => new(); + private sealed class ReplaceVariableExpressionVisitor : ExpressionVisitor { private readonly Expression _replacement; diff --git a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDescendingSortOperationHandler.cs b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDescendingSortOperationHandler.cs index 55ef6875e26..ae7cf4fd464 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDescendingSortOperationHandler.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Expressions/Handlers/QueryableDescendingSortOperationHandler.cs @@ -17,6 +17,8 @@ protected override QueryableSortOperation HandleOperation( return DescendingSortOperation.From(fieldSelector); } + public static QueryableDescendingSortOperationHandler Create(SortProviderContext context) => new(); + private sealed class DescendingSortOperation : QueryableSortOperation { private DescendingSortOperation(QueryableFieldSelector fieldSelector) diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/ISortProviderDescriptor.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/ISortProviderDescriptor.cs index a85d07ce39c..bb81e0fbb8a 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Visitor/ISortProviderDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/ISortProviderDescriptor.cs @@ -3,14 +3,16 @@ namespace HotChocolate.Data.Sorting; public interface ISortProviderDescriptor : IFluent where TContext : ISortVisitorContext { - ISortProviderDescriptor AddFieldHandler() + ISortProviderDescriptor AddFieldHandler( + Func factory) where TFieldHandler : ISortFieldHandler; ISortProviderDescriptor AddFieldHandler( TFieldHandler fieldHandler) where TFieldHandler : ISortFieldHandler; - ISortProviderDescriptor AddOperationHandler() + ISortProviderDescriptor AddOperationHandler( + Func factory) where TOperationHandler : ISortOperationHandler; ISortProviderDescriptor AddOperationHandler( diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortFieldHandlerConfiguration.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortFieldHandlerConfiguration.cs new file mode 100644 index 00000000000..0f695eaf866 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortFieldHandlerConfiguration.cs @@ -0,0 +1,49 @@ +namespace HotChocolate.Data.Sorting; + +public readonly struct SortFieldHandlerConfiguration +{ + private readonly Func? _factory; + private readonly ISortFieldHandler? _instance; + + public SortFieldHandlerConfiguration(ISortFieldHandler instance) + { + _instance = instance; + } + + public SortFieldHandlerConfiguration(Func factory) + { + _factory = factory; + } + + public ISortFieldHandler? Instance => _instance; + + public ISortFieldHandler Create(SortProviderContext context) + where TContext : ISortVisitorContext + { + if (_instance is not null) + { + if (_instance is not ISortFieldHandler handler) + { + throw new InvalidOperationException( + $"Expected handler to be of type ISortFieldHandler<{typeof(TContext).Name}>"); + } + + return handler; + } + + if (_factory is null) + { + throw new InvalidOperationException("Expected to have either a factory or an instance."); + } + + var instance = _factory(context); + + if (instance is not ISortFieldHandler casted) + { + throw new InvalidOperationException( + $"Expected handler to be of type ISortFieldHandler<{typeof(TContext).Name}>"); + } + + return casted; + } +} diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortOperationHandlerConfiguration.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortOperationHandlerConfiguration.cs new file mode 100644 index 00000000000..00a0cc85a5e --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortOperationHandlerConfiguration.cs @@ -0,0 +1,49 @@ +namespace HotChocolate.Data.Sorting; + +public readonly struct SortOperationHandlerConfiguration +{ + private readonly Func? _factory; + private readonly ISortOperationHandler? _instance; + + public SortOperationHandlerConfiguration(ISortOperationHandler instance) + { + _instance = instance; + } + + public SortOperationHandlerConfiguration(Func factory) + { + _factory = factory; + } + + public ISortOperationHandler? Instance => _instance; + + public ISortOperationHandler Create(SortProviderContext context) + where TContext : ISortVisitorContext + { + if (_instance is not null) + { + if (_instance is not ISortOperationHandler handler) + { + throw new InvalidOperationException( + $"Expected handler to be of type ISortOperationHandler<{typeof(TContext).Name}>"); + } + + return handler; + } + + if (_factory is null) + { + throw new InvalidOperationException("Expected to have either a factory or an instance."); + } + + var instance = _factory(context); + + if (instance is not ISortOperationHandler casted) + { + throw new InvalidOperationException( + $"Expected handler to be of type ISortOperationHandler<{typeof(TContext).Name}>"); + } + + return casted; + } +} diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProvider.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProvider.cs index 41448404fc7..aa5726dd8ae 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProvider.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProvider.cs @@ -1,10 +1,8 @@ using HotChocolate.Configuration; using HotChocolate.Types; using HotChocolate.Types.Descriptors; -using HotChocolate.Utilities; using static HotChocolate.Data.DataResources; using static HotChocolate.Data.ThrowHelper; -using static Microsoft.Extensions.DependencyInjection.ActivatorUtilities; namespace HotChocolate.Data.Sorting; @@ -78,12 +76,12 @@ void ISortProviderConvention.Complete(IConventionContext context) /// protected internal override void Complete(IConventionContext context) { - if (Configuration!.Handlers.Count == 0) + if (Configuration!.FieldHandlerConfigurations.Count == 0) { throw SortProvider_NoFieldHandlersConfigured(this); } - if (Configuration.OperationHandlers.Count == 0) + if (Configuration.OperationHandlerConfigurations.Count == 0) { throw SortProvider_NoOperationHandlersConfigured(this); } @@ -95,51 +93,40 @@ protected internal override void Complete(IConventionContext context) context.Scope); } - var services = new CombinedServiceProvider( - new DictionaryServiceProvider( - (typeof(ISortProvider), this), - (typeof(IConventionContext), context), - (typeof(IDescriptorContext), context.DescriptorContext), - (typeof(ISortConvention), _sortConvention), - (typeof(InputParser), context.DescriptorContext.InputParser), - (typeof(ITypeInspector), context.DescriptorContext.TypeInspector)), - context.Services); - - foreach (var (handler, handlerInstance) in Configuration.Handlers) - { - if (handlerInstance is ISortFieldHandler field) - { - _fieldHandlers.Add(field); - continue; - } + var providerContext = new SortProviderContext( + context.Services, + this, + context, + context.DescriptorContext, + _sortConvention, + context.DescriptorContext.TypeInspector, + context.DescriptorContext.InputParser); + foreach (var handlerConfiguration in Configuration.FieldHandlerConfigurations) + { try { - field = (ISortFieldHandler)GetServiceOrCreateInstance(services, handler); - _fieldHandlers.Add(field); + var handler = handlerConfiguration.Create(providerContext); + + _fieldHandlers.Add(handler); } - catch + catch (Exception exception) { - throw SortProvider_UnableToCreateFieldHandler(this, handler); + throw SortProvider_UnableToCreateFieldHandler(this, exception); } } - foreach (var (handler, handlerInstance) in Configuration.OperationHandlers) + foreach (var operationHandlerConfiguration in Configuration.OperationHandlerConfigurations) { - if (handlerInstance is ISortOperationHandler op) - { - _operationHandlers.Add(op); - continue; - } - try { - op = (ISortOperationHandler)GetServiceOrCreateInstance(services, handler); - _operationHandlers.Add(op); + var handler = operationHandlerConfiguration.Create(providerContext); + + _operationHandlers.Add(handler); } - catch + catch (Exception exception) { - throw SortProvider_UnableToCreateOperationHandler(this, handler); + throw SortProvider_UnableToCreateOperationHandler(this, exception); } } } diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderConfiguration.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderConfiguration.cs index ecbb22efd0c..4755109e759 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderConfiguration.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderConfiguration.cs @@ -2,8 +2,7 @@ namespace HotChocolate.Data.Sorting; public class SortProviderConfiguration { - public IList<(Type Handler, ISortFieldHandler? HandlerInstance)> Handlers { get; } = []; + public IList FieldHandlerConfigurations { get; } = []; - public IList<(Type Handler, ISortOperationHandler? HandlerInstance)> OperationHandlers { get; } - = []; + public IList OperationHandlerConfigurations { get; } = []; } diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderContext.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderContext.cs new file mode 100644 index 00000000000..f4f85eba429 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderContext.cs @@ -0,0 +1,28 @@ +using HotChocolate.Types; +using HotChocolate.Types.Descriptors; + +namespace HotChocolate.Data.Sorting; + +public readonly struct SortProviderContext( + IServiceProvider schemaServices, + ISortProvider sortProvider, + IConventionContext conventionContext, + IDescriptorContext descriptorContext, + ISortConvention sortConvention, + ITypeInspector typeInspector, + InputParser inputParser) +{ + public IServiceProvider SchemaServices { get; } = schemaServices; + + public ISortProvider SortProvider { get; } = sortProvider; + + public IConventionContext ConventionContext { get; } = conventionContext; + + public IDescriptorContext DescriptorContext { get; } = descriptorContext; + + public ISortConvention SortConvention { get; } = sortConvention; + + public ITypeInspector TypeInspector { get; } = typeInspector; + + public InputParser InputParser { get; } = inputParser; +} diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderDescriptor.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderDescriptor.cs index 9d0e597f8f8..bfedda1de60 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderDescriptor.cs @@ -12,10 +12,11 @@ protected SortProviderDescriptor() public SortProviderConfiguration CreateConfiguration() => Configuration; - public ISortProviderDescriptor AddFieldHandler() + public ISortProviderDescriptor AddFieldHandler( + Func factory) where TFieldHandler : ISortFieldHandler { - Configuration.Handlers.Add((typeof(TFieldHandler), null)); + Configuration.FieldHandlerConfigurations.Add(new SortFieldHandlerConfiguration(ctx => factory(ctx))); return this; } @@ -23,14 +24,15 @@ public ISortProviderDescriptor AddFieldHandler( TFieldHandler fieldHandler) where TFieldHandler : ISortFieldHandler { - Configuration.Handlers.Add((typeof(TFieldHandler), fieldHandler)); + Configuration.FieldHandlerConfigurations.Add(new SortFieldHandlerConfiguration(fieldHandler)); return this; } - public ISortProviderDescriptor AddOperationHandler() + public ISortProviderDescriptor AddOperationHandler( + Func factory) where TOperationHandler : ISortOperationHandler { - Configuration.OperationHandlers.Add((typeof(TOperationHandler), null)); + Configuration.OperationHandlerConfigurations.Add(new SortOperationHandlerConfiguration(ctx => factory(ctx))); return this; } @@ -38,10 +40,9 @@ public ISortProviderDescriptor AddOperationHandler( TOperationHandler operationHandler) where TOperationHandler : ISortOperationHandler { - Configuration.OperationHandlers.Add((typeof(TOperationHandler), operationHandler)); + Configuration.OperationHandlerConfigurations.Add(new SortOperationHandlerConfiguration(operationHandler)); return this; } - public static SortProviderDescriptor New() => - new SortProviderDescriptor(); + public static SortProviderDescriptor New() => new(); } diff --git a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderExtensions.cs index 585c4918a28..cc7c857ff53 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Visitor/SortProviderExtensions.cs @@ -60,14 +60,14 @@ public override void Merge(IConventionContext context, Convention convention) // Provider extensions should be applied by default before the default handlers, as // the interceptor picks up the first handler. A provider extension should add more // specific handlers than the default providers - for (var i = Configuration.Handlers.Count - 1; i >= 0; i--) + for (var i = Configuration.FieldHandlerConfigurations.Count - 1; i >= 0; i--) { - target.Handlers.Insert(0, Configuration.Handlers[i]); + target.FieldHandlerConfigurations.Insert(0, Configuration.FieldHandlerConfigurations[i]); } - for (var i = Configuration.OperationHandlers.Count - 1; i >= 0; i--) + for (var i = Configuration.OperationHandlerConfigurations.Count - 1; i >= 0; i--) { - target.OperationHandlers.Insert(0, Configuration.OperationHandlers[i]); + target.OperationHandlerConfigurations.Insert(0, Configuration.OperationHandlerConfigurations[i]); } } } diff --git a/src/HotChocolate/Data/src/Data/ThrowHelper.cs b/src/HotChocolate/Data/src/Data/ThrowHelper.cs index 338b077472c..9133a0fa9a6 100644 --- a/src/HotChocolate/Data/src/Data/ThrowHelper.cs +++ b/src/HotChocolate/Data/src/Data/ThrowHelper.cs @@ -144,41 +144,38 @@ scope is null public static SchemaException FilterProvider_UnableToCreateFieldHandler( IFilterProvider filterProvider, - Type fieldHandler) => + Exception exception) => new SchemaException( SchemaErrorBuilder.New() .SetMessage( DataResources.FilterProvider_UnableToCreateFieldHandler, - fieldHandler.FullName ?? fieldHandler.Name, filterProvider.GetType().FullName ?? filterProvider.GetType().Name) .SetExtension(nameof(filterProvider), filterProvider) - .SetExtension(nameof(fieldHandler), fieldHandler) + .SetException(exception) .Build()); public static SchemaException SortProvider_UnableToCreateFieldHandler( ISortProvider sortProvider, - Type fieldHandler) => + Exception exception) => new SchemaException( SchemaErrorBuilder.New() .SetMessage( DataResources.SortProvider_UnableToCreateFieldHandler, - fieldHandler.FullName ?? fieldHandler.Name, sortProvider.GetType().FullName ?? sortProvider.GetType().Name) .SetExtension(nameof(sortProvider), sortProvider) - .SetExtension(nameof(fieldHandler), fieldHandler) + .SetException(exception) .Build()); public static SchemaException SortProvider_UnableToCreateOperationHandler( ISortProvider sortProvider, - Type operationHandler) => + Exception exception) => new SchemaException( SchemaErrorBuilder.New() .SetMessage( DataResources.SortProvider_UnableToCreateOperationHandler, - operationHandler.FullName ?? operationHandler.Name, sortProvider.GetType().FullName ?? sortProvider.GetType().Name) .SetExtension(nameof(sortProvider), sortProvider) - .SetExtension(nameof(operationHandler), operationHandler) + .SetException(exception) .Build()); public static SchemaException SortProvider_NoFieldHandlersConfigured( diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs index 7d02ba39980..d37d45b4a27 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs @@ -16,8 +16,8 @@ public void FilterConvention_Should_Work_When_ConfigurationIsComplete() var provider = new QueryableFilterProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); }); var convention = new FilterConvention( @@ -50,7 +50,7 @@ public void FilterConvention_Should_Fail_When_OperationHandlerIsNotRegistered() { // arrange var provider = new QueryableFilterProvider( - descriptor => descriptor.AddFieldHandler()); + descriptor => descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create)); var convention = new FilterConvention( descriptor => @@ -75,7 +75,7 @@ public void FilterConvention_Should_Fail_When_FieldHandlerIsNotRegistered() { // arrange var provider = new QueryableFilterProvider( - descriptor => descriptor.AddFieldHandler()); + descriptor => descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create)); var convention = new FilterConvention( descriptor => @@ -102,8 +102,8 @@ public void FilterConvention_Should_Fail_When_OperationsInUknown() var provider = new QueryableFilterProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); }); var convention = new FilterConvention( @@ -130,8 +130,8 @@ public void FilterConvention_Should_Fail_When_OperationsIsNotNamed() var provider = new QueryableFilterProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); }); var convention = new FilterConvention( @@ -175,8 +175,8 @@ public void FilterConvention_Should_Fail_When_NoMatchingBindingWasFound() var provider = new QueryableFilterProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); }); var convention = new FilterConvention( @@ -203,8 +203,8 @@ public void FilterConvention_Should_Work_With_Extensions() var provider = new QueryableFilterProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); }); var convention = new FilterConvention( @@ -246,8 +246,8 @@ public void FilterConvention_Should_Work_With_ExtensionsType() var provider = new QueryableFilterProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create); }); var convention = new FilterConvention( @@ -282,7 +282,7 @@ public void FilterConvention_Should_Work_With_ProviderExtensionsType() { // arrange var provider = new QueryableFilterProvider( - descriptor => descriptor.AddFieldHandler()); + descriptor => descriptor.AddFieldHandler(QueryableDefaultFieldHandler.Create)); var convention = new FilterConvention( descriptor => @@ -346,7 +346,7 @@ public void FilterProvider_Throws_Exception_When_NotInitializedByConvention() { // arrange var provider = new QueryableFilterProvider( - descriptor => descriptor.AddFieldHandler()); + descriptor => descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create)); var context = ConventionContext.Create( null, new ServiceCollection().BuildServiceProvider(), @@ -464,7 +464,7 @@ public class MockFilterProviderExtensionConvention : QueryableFilterProviderExte protected override void Configure( IFilterProviderDescriptor descriptor) { - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(QueryableStringEqualsHandler.Create); } } diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorMethodTests.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorMethodTests.cs index c6c64622c4e..26c3b32fd89 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorMethodTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Expression/QueryableFilterVisitorMethodTests.cs @@ -27,8 +27,8 @@ public void Create_MethodSimple_Expression() x.AddDefaults(); x.Provider( new QueryableFilterProvider( - p => p.AddFieldHandler() - .AddFieldHandler() + p => p.AddFieldHandler(QueryableSimpleMethodTest.Create) + .AddFieldHandler(QueryableComplexMethodTest.Create) .AddDefaultFieldHandlers())); })); @@ -57,8 +57,8 @@ public void Create_MethodComplex_Expression() x.AddDefaults(); x.Provider( new QueryableFilterProvider( - p => p.AddFieldHandler() - .AddFieldHandler() + p => p.AddFieldHandler(QueryableSimpleMethodTest.Create) + .AddFieldHandler(QueryableComplexMethodTest.Create) .AddDefaultFieldHandlers())); })); @@ -125,6 +125,8 @@ public override bool TryHandleEnter( action = SyntaxVisitor.Continue; return true; } + + public new static QueryableSimpleMethodTest Create(FilterProviderContext context) => new(context.TypeInspector); } private sealed class QueryableComplexMethodTest : QueryableDefaultFieldHandler @@ -205,6 +207,8 @@ public override bool TryHandleEnter( action = null!; return false; } + + public new static QueryableComplexMethodTest Create(FilterProviderContext context) => new(context.InputParser); } public class Foo diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/FilterProviderExtensionsTests.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/FilterProviderExtensionsTests.cs index 0c7e06f45a3..c3fa18d89a3 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/FilterProviderExtensionsTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/FilterProviderExtensionsTests.cs @@ -35,9 +35,9 @@ public void Merge_Should_Merge_HandlersAndPrependExtensionHandlers() // assert Assert.NotNull(convention.DefinitionAccessor); Assert.Collection( - convention.DefinitionAccessor!.Handlers, - x => Assert.Equal(extensionFieldHandler, x.HandlerInstance), - x => Assert.Equal(firstFieldHandler, x.HandlerInstance)); + convention.DefinitionAccessor!.FieldHandlerConfigurations, + x => Assert.Equal(extensionFieldHandler, x.Instance), + x => Assert.Equal(firstFieldHandler, x.Instance)); } private sealed class MockProviderExtensions diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MatchAnyFieldHandler.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MatchAnyFieldHandler.cs index 53e13945a3c..dacd7851d3c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MatchAnyFieldHandler.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MatchAnyFieldHandler.cs @@ -10,4 +10,6 @@ public override bool CanHandle( ITypeCompletionContext context, IFilterInputTypeConfiguration typeConfiguration, IFilterFieldConfiguration fieldConfiguration) => true; + + public static MatchAnyQueryableFieldHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MockConventionExtensions.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MockConventionExtensions.cs index 1b79e78a252..9a18bdff9a9 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MockConventionExtensions.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Mock/MockConventionExtensions.cs @@ -10,6 +10,6 @@ public static IFilterConventionDescriptor UseMock( return descriptor.AddDefaults().Provider( new QueryableFilterProvider(x => x .AddDefaultFieldHandlers() - .AddFieldHandler())); + .AddFieldHandler(MatchAnyQueryableFieldHandler.Create))); } } diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap b/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap index 1e962c3464d..d785589bc4c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap @@ -16,5 +16,5 @@ For more details look at the `Errors` property. at HotChocolate.Types.Descriptors.DescriptorBase`1.CreateConfiguration() in DescriptorBase~1.cs:line 45 at HotChocolate.Types.ObjectType.CreateConfiguration(ITypeDiscoveryContext context) in ObjectType.Initialization.cs:line 37 at HotChocolate.Types.TypeSystemObject`1.Initialize(ITypeDiscoveryContext context) in TypeSystemObjectBase~1.cs:line 29 - at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 177 + at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 171 diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap b/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap index 1073fa3555e..2f137a98551 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/FilterInputTypeTest.FilterInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap @@ -16,5 +16,5 @@ For more details look at the `Errors` property. at HotChocolate.Types.Descriptors.DescriptorBase`1.CreateConfiguration() in DescriptorBase~1.cs:line 45 at HotChocolate.Types.ObjectType.CreateConfiguration(ITypeDiscoveryContext context) in ObjectType.Initialization.cs:line 37 at HotChocolate.Types.TypeSystemObject`1.Initialize(ITypeDiscoveryContext context) in TypeSystemObjectBase~1.cs:line 29 - at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 177 + at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 171 diff --git a/src/HotChocolate/Data/test/Data.Sorting.InMemory.Tests/QueryableSortVisitorObjectTests.cs b/src/HotChocolate/Data/test/Data.Sorting.InMemory.Tests/QueryableSortVisitorObjectTests.cs index c22d0f78c7c..c91cd007366 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.InMemory.Tests/QueryableSortVisitorObjectTests.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.InMemory.Tests/QueryableSortVisitorObjectTests.cs @@ -471,9 +471,9 @@ public async Task Create_ObjectComplex_OrderBy_Sum() x.AddProviderExtension( new MockProviderExtension(y => { - y.AddFieldHandler(); - y.AddFieldHandler(); - y.AddFieldHandler(); + y.AddFieldHandler(ComplexOrderSumHandler.Create); + y.AddFieldHandler(ComplexOrderSumFieldsHandler.Create); + y.AddFieldHandler(ComplexOrderSumSortHandler.Create); })); }); var tester = _cache.CreateSchema( @@ -621,6 +621,9 @@ public class ComplexOrderSumHandler(ISortConvention convention, InputParser inpu .GetProperties() .ToDictionary(convention.GetFieldName); + public static ComplexOrderSumHandler Create(SortProviderContext context) => + new(context.SortConvention, context.InputParser); + public override bool CanHandle( ITypeCompletionContext context, ISortInputTypeConfiguration typeConfiguration, @@ -677,6 +680,8 @@ public override bool TryHandleLeave( public class ComplexOrderSumFieldsHandler : SortFieldHandler { + public static ComplexOrderSumFieldsHandler Create(SortProviderContext context) => new(); + public override bool CanHandle( ITypeCompletionContext context, ISortInputTypeConfiguration typeConfiguration, @@ -689,6 +694,8 @@ public override bool CanHandle( public class ComplexOrderSumSortHandler : SortFieldHandler { + public static ComplexOrderSumSortHandler Create(SortProviderContext context) => new(); + public override bool CanHandle( ITypeCompletionContext context, ISortInputTypeConfiguration typeConfiguration, diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/Convention/SortConventionTests.cs b/src/HotChocolate/Data/test/Data.Sorting.Tests/Convention/SortConventionTests.cs index 61e807ea571..4859e18e526 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/Convention/SortConventionTests.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/Convention/SortConventionTests.cs @@ -13,8 +13,8 @@ public void SortConvention_Should_Work_When_ConfigurationIsComplete() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -55,7 +55,7 @@ public void SortConvention_Should_Fail_When_OperationHandlerIsNotRegistered() { // arrange var provider = new QueryableSortProvider( - descriptor => descriptor.AddFieldHandler()); + descriptor => descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create)); var convention = new SortConvention( descriptor => @@ -79,7 +79,7 @@ public void SortConvention_Should_Fail_When_FieldHandlerIsNotRegistered() { // arrange var provider = new QueryableSortProvider( - descriptor => descriptor.AddOperationHandler()); + descriptor => descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create)); var convention = new SortConvention( descriptor => @@ -106,8 +106,8 @@ public void SortConvention_Should_Fail_When_OperationsInUknown() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -134,8 +134,8 @@ public void SortConvention_Should_Fail_When_OperationsIsNotNamed() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -161,8 +161,8 @@ public void SortConvention_Should_Fail_When_NoProviderWasRegistered() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -189,8 +189,8 @@ public void SortConvention_Should_Fail_When_NoMatchingBindingWasFound() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -217,8 +217,8 @@ public void SortConvention_Should_Work_With_Extensions() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -268,8 +268,8 @@ public void SortConvention_Should_Work_With_ExtensionsType() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); }); var convention = new SortConvention( @@ -312,7 +312,7 @@ public void SortConvention_Should_Work_With_ProviderExtensionsType() { // arrange var provider = new QueryableSortProvider( - descriptor => descriptor.AddFieldHandler()); + descriptor => descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create)); var convention = new SortConvention( descriptor => @@ -360,8 +360,8 @@ public void GetTypeName_TypeNameEndingWithSortInputType_RemovesTypeSuffix() var provider = new QueryableSortProvider( descriptor => { - descriptor.AddFieldHandler(); - descriptor.AddOperationHandler(); + descriptor.AddFieldHandler(QueryableDefaultSortFieldHandler.Create); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); }); var convention = new SortConvention(descriptor => { @@ -435,7 +435,7 @@ public class MockSortProviderExtensionConvention : QueryableSortProviderExtensio protected override void Configure( ISortProviderDescriptor descriptor) { - descriptor.AddOperationHandler(); + descriptor.AddOperationHandler(QueryableAscendingSortOperationHandler.Create); } } diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyFieldHandler.cs b/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyFieldHandler.cs index 71c0dbcb8ee..beb3fab8d5b 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyFieldHandler.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyFieldHandler.cs @@ -10,4 +10,6 @@ public override bool CanHandle( ITypeCompletionContext context, ISortInputTypeConfiguration typeConfiguration, ISortFieldConfiguration fieldConfiguration) => true; + + public static MatchAnyQueryableFieldHandler Create(SortProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyQueryableOperationHandler.cs b/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyQueryableOperationHandler.cs index 032a26b5f52..c6b3c0d09fe 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyQueryableOperationHandler.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MatchAnyQueryableOperationHandler.cs @@ -11,4 +11,6 @@ public override bool CanHandle( ITypeCompletionContext context, EnumTypeConfiguration typeDefinition, SortEnumValueConfiguration valueConfiguration) => true; + + public static MatchAnyQueryableOperationHandler Create(SortProviderContext context) => new(); } diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MockConventionExtensions.cs b/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MockConventionExtensions.cs index 19a86d37fc8..71385a451d3 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MockConventionExtensions.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/Mock/MockConventionExtensions.cs @@ -10,7 +10,7 @@ public static ISortConventionDescriptor UseMock( return descriptor.AddDefaults().Provider( new QueryableSortProvider(x => x .AddDefaultFieldHandlers() - .AddOperationHandler() - .AddFieldHandler())); + .AddOperationHandler(MatchAnyQueryableOperationHandler.Create) + .AddFieldHandler(MatchAnyQueryableFieldHandler.Create))); } } diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/SortProviderExtensionsTests.cs b/src/HotChocolate/Data/test/Data.Sorting.Tests/SortProviderExtensionsTests.cs index ba37df20220..b6e62d00385 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/SortProviderExtensionsTests.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/SortProviderExtensionsTests.cs @@ -30,9 +30,9 @@ public void Merge_Should_Merge_OperationHandlersAndPrependExtensionHandlers() // assert Assert.NotNull(convention.DefinitionAccessor); Assert.Collection( - convention.DefinitionAccessor!.OperationHandlers, - x => Assert.Equal(extensionFieldHandler, x.HandlerInstance), - x => Assert.Equal(firstFieldHandler, x.HandlerInstance)); + convention.DefinitionAccessor!.OperationHandlerConfigurations, + x => Assert.Equal(extensionFieldHandler, x.Instance), + x => Assert.Equal(firstFieldHandler, x.Instance)); } [Fact] @@ -58,9 +58,9 @@ public void Merge_Should_Merge_HandlersAndPrependExtensionHandlers() // assert Assert.NotNull(convention.DefinitionAccessor); Assert.Collection( - convention.DefinitionAccessor!.Handlers, - x => Assert.Equal(extensionFieldHandler, x.HandlerInstance), - x => Assert.Equal(firstFieldHandler, x.HandlerInstance)); + convention.DefinitionAccessor!.FieldHandlerConfigurations, + x => Assert.Equal(extensionFieldHandler, x.Instance), + x => Assert.Equal(firstFieldHandler, x.Instance)); } private sealed class MockFieldHandler : QueryableDefaultSortFieldHandler; diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap b/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap index b521a2f755b..8f2169487ff 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegistered.snap @@ -16,5 +16,5 @@ For more details look at the `Errors` property. at HotChocolate.Types.Descriptors.DescriptorBase`1.CreateConfiguration() in DescriptorBase~1.cs:line 45 at HotChocolate.Types.ObjectType.CreateConfiguration(ITypeDiscoveryContext context) in ObjectType.Initialization.cs:line 37 at HotChocolate.Types.TypeSystemObject`1.Initialize(ITypeDiscoveryContext context) in TypeSystemObjectBase~1.cs:line 29 - at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 177 + at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 171 diff --git a/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap b/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap index 80dafbc7232..1d083815354 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap +++ b/src/HotChocolate/Data/test/Data.Sorting.Tests/__snapshots__/SortInputTypeTests.SortInputType_Should_ThrowException_WhenNoConventionIsRegisteredDefault.snap @@ -16,5 +16,5 @@ For more details look at the `Errors` property. at HotChocolate.Types.Descriptors.DescriptorBase`1.CreateConfiguration() in DescriptorBase~1.cs:line 45 at HotChocolate.Types.ObjectType.CreateConfiguration(ITypeDiscoveryContext context) in ObjectType.Initialization.cs:line 37 at HotChocolate.Types.TypeSystemObject`1.Initialize(ITypeDiscoveryContext context) in TypeSystemObjectBase~1.cs:line 29 - at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 177 + at HotChocolate.Configuration.TypeRegistrar.InitializeType(TypeSystemObject typeSystemObject, String scope, Boolean isInferred) in TypeRegistrar.cs:line 171 diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs index 0357532fffc..531406760fa 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs @@ -31,13 +31,13 @@ public class ActivityEnricher /// /// Initializes a new instance of . /// - /// + /// /// protected ActivityEnricher( - ObjectPool stringBuilderPoolPool, + ObjectPool stringBuilderPool, InstrumentationOptions options) { - StringBuilderPool = stringBuilderPoolPool; + StringBuilderPool = stringBuilderPool; _options = options; } diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/Extensions/DiagnosticsRequestExecutorBuilderExtensions.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/Extensions/DiagnosticsRequestExecutorBuilderExtensions.cs index 0040e709956..73169370f2a 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/Extensions/DiagnosticsRequestExecutorBuilderExtensions.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/Extensions/DiagnosticsRequestExecutorBuilderExtensions.cs @@ -48,16 +48,17 @@ public static IRequestExecutorBuilder AddInstrumentation( ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(options); - builder.Services.TryAddSingleton( - sp => - { - var optionInst = new InstrumentationOptions(); - options(sp, optionInst); - return optionInst; - }); - + builder.Services.TryAddSingleton(sp => + { + var optionInst = new InstrumentationOptions(); + options(sp, optionInst); + return optionInst; + }); builder.Services.TryAddSingleton(); + builder.AddApplicationService(); + builder.AddApplicationService(); + builder.AddDiagnosticEventListener( sp => new ActivityExecutionDiagnosticListener( sp.GetService() ?? @@ -82,9 +83,9 @@ public static IRequestExecutorBuilder AddInstrumentation( private sealed class InternalActivityEnricher : ActivityEnricher { public InternalActivityEnricher( - ObjectPool stringBuilderPoolPool, + ObjectPool stringBuilderPool, InstrumentationOptions options) - : base(stringBuilderPoolPool, options) + : base(stringBuilderPool, options) { } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Diagnostics.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Diagnostics.cs index 514747d4b7a..2fa13251ad9 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Diagnostics.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Diagnostics.cs @@ -21,7 +21,8 @@ public static partial class CoreFusionGatewayBuilderExtensions /// The fusion gateway builder. /// public static IFusionGatewayBuilder AddDiagnosticEventListener< - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + T>( this IFusionGatewayBuilder builder) where T : class { @@ -37,14 +38,22 @@ public static IFusionGatewayBuilder AddDiagnosticEventListener< } else if (typeof(T).IsDefined(typeof(DiagnosticEventSourceAttribute), true)) { - builder.ConfigureSchemaServices(static (_, s) => - { - var attribute = typeof(T).GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true).First(); - var listener = ((DiagnosticEventSourceAttribute)attribute).Listener; + var attribute = (DiagnosticEventSourceAttribute)typeof(T).GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true).First(); + var listener = attribute.Listener; - s.TryAddSingleton(); - s.AddSingleton(listener, sp => sp.GetRequiredService()); - }); + if (attribute.IsSchemaService) + { + builder.ConfigureSchemaServices((_, s) => + { + s.TryAddSingleton(); + s.AddSingleton(listener, sp => sp.GetRequiredService()); + }); + } + else + { + builder.Services.TryAddSingleton(); + builder.Services.AddSingleton(listener, sp => sp.GetRequiredService()); + } } else { @@ -69,7 +78,8 @@ public static IFusionGatewayBuilder AddDiagnosticEventListener< /// /// The fusion gateway builder. /// - public static IFusionGatewayBuilder AddDiagnosticEventListener( + public static IFusionGatewayBuilder AddDiagnosticEventListener< + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>( this IFusionGatewayBuilder builder, Func factory) where T : class @@ -84,22 +94,15 @@ public static IFusionGatewayBuilder AddDiagnosticEventListener( } else if (typeof(T).IsDefined(typeof(DiagnosticEventSourceAttribute), true)) { - var attribute = - (DiagnosticEventSourceAttribute)typeof(T) - .GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true) - .First(); + var attribute = (DiagnosticEventSourceAttribute)typeof(T).GetCustomAttributes(typeof(DiagnosticEventSourceAttribute), true).First(); + var listener = attribute.Listener; if (attribute.IsSchemaService) { - builder.ConfigureSchemaServices((_, s) => - { - var listener = attribute.Listener; - s.AddSingleton(listener, factory); - }); + builder.ConfigureSchemaServices((_, s) => s.AddSingleton(listener, factory)); } else { - var listener = attribute.Listener; builder.Services.AddSingleton(listener, factory); } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Services.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Services.cs new file mode 100644 index 00000000000..72ea99ebe98 --- /dev/null +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.Services.cs @@ -0,0 +1,22 @@ +using HotChocolate.Fusion.Configuration; + +namespace Microsoft.Extensions.DependencyInjection; + +public static partial class CoreFusionGatewayBuilderExtensions +{ + /// + /// Resolves an instance of from the application + /// service provider and makes it available as a singleton through the schema + /// service provider. + /// + /// + /// The type of service. + /// + public static IFusionGatewayBuilder AddApplicationService( + this IFusionGatewayBuilder builder) + where TService : class + { + return builder.ConfigureSchemaServices( + static (sp, sc) => sc.AddSingleton(sp.GetRequiredService())); + } +} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/InternalServiceProviderExtensions.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/InternalServiceProviderExtensions.cs deleted file mode 100644 index 2ff165275af..00000000000 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/InternalServiceProviderExtensions.cs +++ /dev/null @@ -1,9 +0,0 @@ -using HotChocolate; - -namespace Microsoft.Extensions.DependencyInjection; - -internal static class InternalServiceProviderExtensions -{ - public static T GetRequiredRootService(this IServiceProvider services) where T : notnull - => services.GetRequiredService().ServiceProvider.GetRequiredService(); -} diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs index 172525d0a25..3bee9767122 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs @@ -308,7 +308,7 @@ public async Task Executor_Resolution_Should_Be_Parallel() cts.Dispose(); } - [Fact(Skip = "SomeService needs to be registered with the schema services")] + [Fact] public async Task WarmupTask_Should_Be_Able_To_Access_Schema_And_Regular_Services() { // arrange @@ -319,6 +319,7 @@ public async Task WarmupTask_Should_Be_Able_To_Access_Schema_And_Regular_Service services .AddGraphQLGateway() .AddInMemoryConfiguration(CreateConfiguration().Schema) + .AddApplicationService() .AddWarmupTask(); var provider = services.BuildServiceProvider(); var manager = provider.GetRequiredService(); diff --git a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableInHandler.cs b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableInHandler.cs index 5da77047d7e..07d3f037b8c 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableInHandler.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableInHandler.cs @@ -31,6 +31,9 @@ public MartenQueryableComparableInHandler( /// protected override int Operation => DefaultFilterOperations.In; + public static MartenQueryableComparableInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + /// public override Expression HandleOperation( QueryableFilterContext context, diff --git a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableNotInHandler.cs b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableNotInHandler.cs index 5825df64a0f..fa5d03a79b6 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableNotInHandler.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableComparableNotInHandler.cs @@ -31,6 +31,9 @@ public MartenQueryableComparableNotInHandler( /// protected override int Operation => DefaultFilterOperations.NotIn; + public static MartenQueryableComparableNotInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + /// public override Expression HandleOperation( QueryableFilterContext context, diff --git a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumInHandler.cs b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumInHandler.cs index 9a13ebe0d66..11043385878 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumInHandler.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumInHandler.cs @@ -23,6 +23,9 @@ public MartenQueryableEnumInHandler( { } + public new static MartenQueryableEnumInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumNotInHandler.cs b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumNotInHandler.cs index c2e95c46e17..f047c96229e 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumNotInHandler.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableEnumNotInHandler.cs @@ -23,6 +23,9 @@ public MartenQueryableEnumNotInHandler( { } + public new static MartenQueryableEnumNotInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringInHandler.cs b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringInHandler.cs index ad2fb571750..5b604f2cf46 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringInHandler.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringInHandler.cs @@ -24,6 +24,9 @@ public MartenQueryableStringInHandler(InputParser inputParser) : base(inputParse /// protected override int Operation => DefaultFilterOperations.In; + public static MartenQueryableStringInHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override Expression HandleOperation( QueryableFilterContext context, diff --git a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringNotInHandler.cs b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringNotInHandler.cs index 161988e360e..bfaae46ac60 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringNotInHandler.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/Handlers/MartenQueryableStringNotInHandler.cs @@ -24,6 +24,9 @@ public MartenQueryableStringNotInHandler(InputParser inputParser) : base(inputPa /// protected override int Operation => DefaultFilterOperations.NotIn; + public static MartenQueryableStringNotInHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override Expression HandleOperation( QueryableFilterContext context, diff --git a/src/HotChocolate/Marten/src/Data/Filtering/MartenQueryableFilterProvider.cs b/src/HotChocolate/Marten/src/Data/Filtering/MartenQueryableFilterProvider.cs index 67be35f7f3f..30ccf98381f 100644 --- a/src/HotChocolate/Marten/src/Data/Filtering/MartenQueryableFilterProvider.cs +++ b/src/HotChocolate/Marten/src/Data/Filtering/MartenQueryableFilterProvider.cs @@ -33,12 +33,12 @@ public MartenQueryableFilterProvider() /// protected override void Configure(IFilterProviderDescriptor descriptor) { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(MartenQueryableComparableInHandler.Create); + descriptor.AddFieldHandler(MartenQueryableComparableNotInHandler.Create); + descriptor.AddFieldHandler(MartenQueryableEnumInHandler.Create); + descriptor.AddFieldHandler(MartenQueryableEnumNotInHandler.Create); + descriptor.AddFieldHandler(MartenQueryableStringInHandler.Create); + descriptor.AddFieldHandler(MartenQueryableStringNotInHandler.Create); descriptor.AddDefaultFieldHandlers(); } diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Convention/Extensions/FilterConventionDescriptorMongoDbExtensions.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Convention/Extensions/FilterConventionDescriptorMongoDbExtensions.cs index 2c5b6a71341..dab17f8c555 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Convention/Extensions/FilterConventionDescriptorMongoDbExtensions.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Convention/Extensions/FilterConventionDescriptorMongoDbExtensions.cs @@ -22,34 +22,34 @@ public static IFilterProviderDescriptor AddDefaultMongoDbFieldHandlers( this IFilterProviderDescriptor descriptor) { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(MongoDbEqualsOperationHandler.Create); + descriptor.AddFieldHandler(MongoDbNotEqualsOperationHandler.Create); + + descriptor.AddFieldHandler(MongoDbInOperationHandler.Create); + descriptor.AddFieldHandler(MongoDbNotInOperationHandler.Create); + + descriptor.AddFieldHandler(MongoDbComparableGreaterThanHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableNotGreaterThanHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableGreaterThanOrEqualsHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableNotGreaterThanOrEqualsHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableLowerThanHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableNotLowerThanHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableLowerThanOrEqualsHandler.Create); + descriptor.AddFieldHandler(MongoDbComparableNotLowerThanOrEqualsHandler.Create); + + descriptor.AddFieldHandler(MongoDbStringStartsWithHandler.Create); + descriptor.AddFieldHandler(MongoDbStringNotStartsWithHandler.Create); + descriptor.AddFieldHandler(MongoDbStringEndsWithHandler.Create); + descriptor.AddFieldHandler(MongoDbStringNotEndsWithHandler.Create); + descriptor.AddFieldHandler(MongoDbStringContainsHandler.Create); + descriptor.AddFieldHandler(MongoDbStringNotContainsHandler.Create); + + descriptor.AddFieldHandler(MongoDbListAllOperationHandler.Create); + descriptor.AddFieldHandler(MongoDbListAnyOperationHandler.Create); + descriptor.AddFieldHandler(MongoDbListNoneOperationHandler.Create); + descriptor.AddFieldHandler(MongoDbListSomeOperationHandler.Create); + + descriptor.AddFieldHandler(MongoDbDefaultFieldHandler.Create); return descriptor; } diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanHandler.cs index 50f136bc267..c749066e1d6 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableGreaterThanHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.GreaterThan; + public static MongoDbComparableGreaterThanHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanOrEqualsHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanOrEqualsHandler.cs index 572654e4f5a..c89650fabd1 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanOrEqualsHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableGreaterThanOrEqualsHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableGreaterThanOrEqualsHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.GreaterThanOrEquals; + public static MongoDbComparableGreaterThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanHandler.cs index 7bda5a4b5b6..812eb637719 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableLowerThanHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.LowerThan; + public static MongoDbComparableLowerThanHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanOrEqualsHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanOrEqualsHandler.cs index 5b788416d61..fc065d3f611 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanOrEqualsHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableLowerThanOrEqualsHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableLowerThanOrEqualsHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.LowerThanOrEquals; + public static MongoDbComparableLowerThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanHandler.cs index bd1d3e31500..b240d025fa8 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableNotGreaterThanHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.NotGreaterThan; + public static MongoDbComparableNotGreaterThanHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanOrEqualsHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanOrEqualsHandler.cs index 8ad75613f78..4d8abfc9f06 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanOrEqualsHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotGreaterThanOrEqualsHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableNotGreaterThanOrEqualsHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.NotGreaterThanOrEquals; + public static MongoDbComparableNotGreaterThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanHandler.cs index d04a7b5b2f2..34be5f88ceb 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableNotLowerThanHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.NotLowerThan; + public static MongoDbComparableNotLowerThanHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanOrEqualsHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanOrEqualsHandler.cs index dac71028493..4bfef47b0af 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanOrEqualsHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/Comparable/MongoDbComparableNotLowerThanOrEqualsHandler.cs @@ -21,6 +21,9 @@ public MongoDbComparableNotLowerThanOrEqualsHandler(InputParser inputParser) /// protected override int Operation => DefaultFilterOperations.NotLowerThanOrEquals; + public static MongoDbComparableNotLowerThanOrEqualsHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAllOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAllOperationHandler.cs index 2fdf5a8d52a..bca8dab2304 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAllOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAllOperationHandler.cs @@ -13,6 +13,9 @@ public class MongoDbListAllOperationHandler : MongoDbListOperationHandlerBase /// protected override int Operation => DefaultFilterOperations.All; + public static MongoDbListAllOperationHandler Create(FilterProviderContext context) + => new(); + /// protected override MongoDbFilterDefinition HandleListOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAnyOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAnyOperationHandler.cs index baa69b1571a..f80d9ff9135 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAnyOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListAnyOperationHandler.cs @@ -19,6 +19,9 @@ public MongoDbListAnyOperationHandler(InputParser inputParser) : base(inputParse CanBeNull = false; } + public static MongoDbListAnyOperationHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListNoneOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListNoneOperationHandler.cs index aeda794e351..7b319e5cc71 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListNoneOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListNoneOperationHandler.cs @@ -13,6 +13,9 @@ public class MongoDbListNoneOperationHandler : MongoDbListOperationHandlerBase /// protected override int Operation => DefaultFilterOperations.None; + public static MongoDbListNoneOperationHandler Create(FilterProviderContext context) + => new(); + /// protected override MongoDbFilterDefinition HandleListOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListSomeOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListSomeOperationHandler.cs index e83b1ea3258..e1db82fcd51 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListSomeOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/List/MongoDbListSomeOperationHandler.cs @@ -12,6 +12,9 @@ public class MongoDbListSomeOperationHandler : MongoDbListOperationHandlerBase /// protected override int Operation => DefaultFilterOperations.Some; + public static MongoDbListSomeOperationHandler Create(FilterProviderContext context) + => new(); + /// protected override MongoDbFilterDefinition HandleListOperation( MongoDbFilterVisitorContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbDefaultFieldHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbDefaultFieldHandler.cs index 6d47ba21be3..5884680119a 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbDefaultFieldHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbDefaultFieldHandler.cs @@ -13,6 +13,9 @@ namespace HotChocolate.Data.MongoDb.Filters; public class MongoDbDefaultFieldHandler : FilterFieldHandler { + public static MongoDbDefaultFieldHandler Create(FilterProviderContext context) + => new(); + /// /// Checks if the field not a filter operations field /// diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbEqualsOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbEqualsOperationHandler.cs index 5fb9a485f3d..f998b8de178 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbEqualsOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbEqualsOperationHandler.cs @@ -17,6 +17,9 @@ public MongoDbEqualsOperationHandler(InputParser inputParser) : base(inputParser { } + public static MongoDbEqualsOperationHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbInOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbInOperationHandler.cs index dd8d0f46c77..6a576a0def6 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbInOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbInOperationHandler.cs @@ -17,6 +17,9 @@ public MongoDbInOperationHandler(InputParser inputParser) : base(inputParser) { } + public static MongoDbInOperationHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotEqualsOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotEqualsOperationHandler.cs index 349aa9a187e..877f1bc0481 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotEqualsOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotEqualsOperationHandler.cs @@ -17,6 +17,9 @@ public MongoDbNotEqualsOperationHandler(InputParser inputParser) : base(inputPar { } + public static MongoDbNotEqualsOperationHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotInOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotInOperationHandler.cs index a779a41ea1e..c6ec1052fd2 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotInOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/MongoDbNotInOperationHandler.cs @@ -17,6 +17,9 @@ public MongoDbNotInOperationHandler(InputParser inputParser) : base(inputParser) { } + public static MongoDbNotInOperationHandler Create(FilterProviderContext context) + => new(context.InputParser); + /// public override bool CanHandle( ITypeCompletionContext context, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringContainsHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringContainsHandler.cs index 1f3a0ce8272..09b5b5cae4a 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringContainsHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringContainsHandler.cs @@ -17,6 +17,9 @@ public MongoDbStringContainsHandler(InputParser inputParser) protected override int Operation => DefaultFilterOperations.Contains; + public static MongoDbStringContainsHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, IFilterOperationField field, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringEndsWithHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringEndsWithHandler.cs index f9f8ed55916..40f6ccb5fd9 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringEndsWithHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringEndsWithHandler.cs @@ -17,6 +17,9 @@ public MongoDbStringEndsWithHandler(InputParser inputParser) protected override int Operation => DefaultFilterOperations.EndsWith; + public static MongoDbStringEndsWithHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, IFilterOperationField field, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotContainsHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotContainsHandler.cs index 9e498a51493..72fb67762ae 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotContainsHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotContainsHandler.cs @@ -17,6 +17,9 @@ public MongoDbStringNotContainsHandler(InputParser inputParser) protected override int Operation => DefaultFilterOperations.NotContains; + public static MongoDbStringNotContainsHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, IFilterOperationField field, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotEndsWithHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotEndsWithHandler.cs index ceecebdfb27..97f84dbb113 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotEndsWithHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotEndsWithHandler.cs @@ -17,6 +17,9 @@ public MongoDbStringNotEndsWithHandler(InputParser inputParser) protected override int Operation => DefaultFilterOperations.NotEndsWith; + public static MongoDbStringNotEndsWithHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, IFilterOperationField field, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotStartsWithHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotStartsWithHandler.cs index 29802f143f6..6b1da3931b5 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotStartsWithHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringNotStartsWithHandler.cs @@ -17,6 +17,9 @@ public MongoDbStringNotStartsWithHandler(InputParser inputParser) protected override int Operation => DefaultFilterOperations.NotStartsWith; + public static MongoDbStringNotStartsWithHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, IFilterOperationField field, diff --git a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringStartsWithHandler.cs b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringStartsWithHandler.cs index 21ca030d31a..f1e9a05dd17 100644 --- a/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringStartsWithHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Filters/Handlers/String/MongoDbStringStartsWithHandler.cs @@ -17,6 +17,9 @@ public MongoDbStringStartsWithHandler(InputParser inputParser) protected override int Operation => DefaultFilterOperations.StartsWith; + public static MongoDbStringStartsWithHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override MongoDbFilterDefinition HandleOperation( MongoDbFilterVisitorContext context, IFilterOperationField field, diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs index a23ae5bee6a..6a5714432a8 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs @@ -28,10 +28,10 @@ public static IProjectionProviderDescriptor RegisterMongoDbHandlers( { ArgumentNullException.ThrowIfNull(descriptor); - descriptor.RegisterFieldHandler(); - descriptor.RegisterFieldHandler(); - descriptor.RegisterOptimizer(); - descriptor.RegisterOptimizer(); + descriptor.RegisterFieldHandler(MongoDbProjectionScalarHandler.Create); + descriptor.RegisterFieldHandler(MongoDbProjectionFieldHandler.Create); + descriptor.RegisterOptimizer(QueryablePagingProjectionOptimizer.Create); + descriptor.RegisterOptimizer(IsProjectedProjectionOptimizer.Create); return descriptor; } } diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs index e5660f6e0f9..b089ef4ca76 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs @@ -35,4 +35,6 @@ public override bool TryHandleLeave( action = SelectionVisitor.Continue; return true; } + + public static MongoDbProjectionFieldHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs index da16610f32a..e093ef61513 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs @@ -28,4 +28,6 @@ public override bool TryHandleEnter( action = SelectionVisitor.SkipAndLeave; return true; } + + public static MongoDbProjectionScalarHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/MongoDb/src/Data/Sorting/Convention/Extensions/SortConventionDescriptorMongoExtensions.cs b/src/HotChocolate/MongoDb/src/Data/Sorting/Convention/Extensions/SortConventionDescriptorMongoExtensions.cs index 3522999b75b..bd753e2bbf9 100644 --- a/src/HotChocolate/MongoDb/src/Data/Sorting/Convention/Extensions/SortConventionDescriptorMongoExtensions.cs +++ b/src/HotChocolate/MongoDb/src/Data/Sorting/Convention/Extensions/SortConventionDescriptorMongoExtensions.cs @@ -22,9 +22,9 @@ public static ISortConventionDescriptor UseMongoDbProvider( public static ISortProviderDescriptor AddDefaultFieldHandlers( this ISortProviderDescriptor descriptor) { - descriptor.AddOperationHandler(); - descriptor.AddOperationHandler(); - descriptor.AddFieldHandler(); + descriptor.AddOperationHandler(MongoDbAscendingSortOperationHandler.Create); + descriptor.AddOperationHandler(MongoDbDescendingSortOperationHandler.Create); + descriptor.AddFieldHandler(MongoDbDefaultSortFieldHandler.Create); return descriptor; } } diff --git a/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbAscendingSortOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbAscendingSortOperationHandler.cs index 8772f2e424f..1c2325a9272 100644 --- a/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbAscendingSortOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbAscendingSortOperationHandler.cs @@ -4,4 +4,7 @@ namespace HotChocolate.Data.MongoDb.Sorting; public class MongoDbAscendingSortOperationHandler() - : MongoDbSortOperationHandlerBase(DefaultSortOperations.Ascending, SortDirection.Ascending); + : MongoDbSortOperationHandlerBase(DefaultSortOperations.Ascending, SortDirection.Ascending) +{ + public static MongoDbAscendingSortOperationHandler Create(SortProviderContext context) => new(); +} diff --git a/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDefaultSortFieldHandler.cs b/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDefaultSortFieldHandler.cs index 3f88b0a40f9..1d4ce2c4fba 100644 --- a/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDefaultSortFieldHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDefaultSortFieldHandler.cs @@ -49,4 +49,6 @@ public override bool TryHandleLeave( action = SyntaxVisitor.Continue; return true; } + + public static MongoDbDefaultSortFieldHandler Create(SortProviderContext context) => new(); } diff --git a/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDescendingSortOperationHandler.cs b/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDescendingSortOperationHandler.cs index 87248b797c7..8b5fd6a8f53 100644 --- a/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDescendingSortOperationHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Sorting/Handlers/MongoDbDescendingSortOperationHandler.cs @@ -4,4 +4,7 @@ namespace HotChocolate.Data.MongoDb.Sorting; public class MongoDbDescendingSortOperationHandler() - : MongoDbSortOperationHandlerBase(DefaultSortOperations.Descending, SortDirection.Descending); + : MongoDbSortOperationHandlerBase(DefaultSortOperations.Descending, SortDirection.Descending) +{ + public static MongoDbDescendingSortOperationHandler Create(SortProviderContext context) => new(); +} diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.AzureBlobStorage/Extensions/HotChocolateAzureBlobStoragePersistedOperationsRequestExecutorBuilderExtensions.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.AzureBlobStorage/Extensions/HotChocolateAzureBlobStoragePersistedOperationsRequestExecutorBuilderExtensions.cs index 7162292cfad..19e7568a908 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.AzureBlobStorage/Extensions/HotChocolateAzureBlobStoragePersistedOperationsRequestExecutorBuilderExtensions.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.AzureBlobStorage/Extensions/HotChocolateAzureBlobStoragePersistedOperationsRequestExecutorBuilderExtensions.cs @@ -27,7 +27,6 @@ public static IRequestExecutorBuilder AddAzureBlobStorageOperationDocumentStorag ArgumentNullException.ThrowIfNull(containerClientFactory); return builder.ConfigureSchemaServices( - s => s.AddAzureBlobStorageOperationDocumentStorage( - sp => containerClientFactory(sp.GetCombinedServices()))); + s => s.AddAzureBlobStorageOperationDocumentStorage(containerClientFactory)); } } diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Redis/Extensions/HotChocolateRedisPersistedOperationsRequestExecutorBuilderExtensions.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Redis/Extensions/HotChocolateRedisPersistedOperationsRequestExecutorBuilderExtensions.cs index f95141d9ffa..e792441f084 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Redis/Extensions/HotChocolateRedisPersistedOperationsRequestExecutorBuilderExtensions.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Redis/Extensions/HotChocolateRedisPersistedOperationsRequestExecutorBuilderExtensions.cs @@ -31,9 +31,7 @@ public static IRequestExecutorBuilder AddRedisOperationDocumentStorage( ArgumentNullException.ThrowIfNull(databaseFactory); return builder.ConfigureSchemaServices( - s => s.AddRedisOperationDocumentStorage( - sp => databaseFactory(sp.GetCombinedServices()), - queryExpiration)); + s => s.AddRedisOperationDocumentStorage(databaseFactory, queryExpiration)); } /// @@ -58,7 +56,7 @@ public static IRequestExecutorBuilder AddRedisOperationDocumentStorage( return builder.ConfigureSchemaServices( s => s.AddRedisOperationDocumentStorage( - sp => multiplexerFactory(sp.GetCombinedServices()).GetDatabase(), + sp => multiplexerFactory(sp).GetDatabase(), queryExpiration)); } @@ -79,6 +77,8 @@ public static IRequestExecutorBuilder AddRedisOperationDocumentStorage( { ArgumentNullException.ThrowIfNull(builder); + builder.AddApplicationService(); + return builder.AddRedisOperationDocumentStorage( sp => sp.GetRequiredService(), queryExpiration); diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs index 18729b9ac00..76c9a28b38b 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs @@ -154,6 +154,7 @@ public async Task ExecutePersistedOperation_ApplicationDI() // we register the multiplexer on the application services .AddSingleton(_multiplexer) .AddGraphQL() + .AddApplicationService() .AddQueryType(c => c.Name("Query").Field("a").Resolve("b")) // and in the redis storage setup refer to that instance. .AddRedisOperationDocumentStorage(sp => sp.GetRequiredService()) diff --git a/src/HotChocolate/Primitives/src/Primitives/DiagnosticEventSourceAttribute.cs b/src/HotChocolate/Primitives/src/Primitives/DiagnosticEventSourceAttribute.cs index 434b410ec6c..df898623d3c 100644 --- a/src/HotChocolate/Primitives/src/Primitives/DiagnosticEventSourceAttribute.cs +++ b/src/HotChocolate/Primitives/src/Primitives/DiagnosticEventSourceAttribute.cs @@ -19,7 +19,7 @@ public class DiagnosticEventSourceAttribute : Attribute /// public DiagnosticEventSourceAttribute(Type listener, bool isSchemaService = true) { - ArgumentNullException.ThrowIfNull(listener, nameof(listener)); + ArgumentNullException.ThrowIfNull(listener); Listener = listener; IsSchemaService = isSchemaService; diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableInHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableInHandler.cs index db316c408ba..a8783e1f7cd 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableInHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableInHandler.cs @@ -19,6 +19,9 @@ public RavenComparableInHandler( protected override int Operation => DefaultFilterOperations.In; + public static RavenComparableInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + public override Expression HandleOperation( QueryableFilterContext context, IFilterOperationField field, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableNotInHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableNotInHandler.cs index e076af36f1f..ed5c5dc4c1c 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableNotInHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenComparableNotInHandler.cs @@ -19,6 +19,9 @@ public RavenComparableNotInHandler( protected override int Operation => DefaultFilterOperations.NotIn; + public static RavenComparableNotInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + public override Expression HandleOperation( QueryableFilterContext context, IFilterOperationField field, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumInHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumInHandler.cs index ff419c99e62..00e272b2fd9 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumInHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumInHandler.cs @@ -14,6 +14,9 @@ public RavenEnumInHandler( { } + public new static RavenEnumInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + public override bool CanHandle( ITypeCompletionContext context, IFilterInputTypeConfiguration typeConfiguration, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumNotInHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumNotInHandler.cs index dfe88ee4473..26b664f14ab 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumNotInHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenEnumNotInHandler.cs @@ -14,6 +14,9 @@ public RavenEnumNotInHandler( { } + public new static RavenEnumNotInHandler Create(FilterProviderContext context) + => new(context.TypeConverter, context.InputParser); + public override bool CanHandle( ITypeCompletionContext context, IFilterInputTypeConfiguration typeConfiguration, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringContainsHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringContainsHandler.cs index 3bc648af163..6d95908bba6 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringContainsHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringContainsHandler.cs @@ -15,6 +15,9 @@ public RavenStringContainsHandler(InputParser inputParser) : base(inputParser) protected override int Operation => DefaultFilterOperations.Contains; + public static RavenStringContainsHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override Expression HandleOperation( QueryableFilterContext context, IFilterOperationField field, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringInHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringInHandler.cs index 126e97bac5a..ef352ec823f 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringInHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringInHandler.cs @@ -14,6 +14,9 @@ public RavenStringInHandler(InputParser inputParser) : base(inputParser) protected override int Operation => DefaultFilterOperations.In; + public static RavenStringInHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override Expression HandleOperation( QueryableFilterContext context, IFilterOperationField field, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotContainsHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotContainsHandler.cs index e75f5f3afb7..fe554e6aff7 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotContainsHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotContainsHandler.cs @@ -15,6 +15,9 @@ public RavenStringNotContainsHandler(InputParser inputParser) : base(inputParser protected override int Operation => DefaultFilterOperations.NotContains; + public new static RavenStringNotContainsHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override Expression HandleOperation( QueryableFilterContext context, IFilterOperationField field, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotInHandler.cs b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotInHandler.cs index 9b721ad6c16..83575ead320 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotInHandler.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/Handlers/RavenStringNotInHandler.cs @@ -14,6 +14,9 @@ public RavenStringNotInHandler(InputParser inputParser) : base(inputParser) protected override int Operation => DefaultFilterOperations.NotIn; + public static RavenStringNotInHandler Create(FilterProviderContext context) + => new(context.InputParser); + public override Expression HandleOperation( QueryableFilterContext context, IFilterOperationField field, diff --git a/src/HotChocolate/Raven/src/Data/Filtering/RavenQueryableFilterProvider.cs b/src/HotChocolate/Raven/src/Data/Filtering/RavenQueryableFilterProvider.cs index 39c55251096..ac90e7f4cf7 100644 --- a/src/HotChocolate/Raven/src/Data/Filtering/RavenQueryableFilterProvider.cs +++ b/src/HotChocolate/Raven/src/Data/Filtering/RavenQueryableFilterProvider.cs @@ -22,14 +22,14 @@ public RavenQueryableFilterProvider() { } protected override void Configure(IFilterProviderDescriptor descriptor) { - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); - descriptor.AddFieldHandler(); + descriptor.AddFieldHandler(RavenComparableInHandler.Create); + descriptor.AddFieldHandler(RavenComparableNotInHandler.Create); + descriptor.AddFieldHandler(RavenStringInHandler.Create); + descriptor.AddFieldHandler(RavenStringNotInHandler.Create); + descriptor.AddFieldHandler(RavenEnumInHandler.Create); + descriptor.AddFieldHandler(RavenEnumNotInHandler.Create); + descriptor.AddFieldHandler(RavenStringNotContainsHandler.Create); + descriptor.AddFieldHandler(RavenStringContainsHandler.Create); descriptor.AddDefaultFieldHandlers(); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs index 840c79bd716..a43e1152313 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs @@ -7,19 +7,22 @@ namespace HotChocolate.Data; public static class SpatialFilterProviderDescriptorQueryableExtensions { public static IFilterProviderDescriptor AddSpatialHandlers( - this IFilterProviderDescriptor descriptor) => - descriptor - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler() - .AddFieldHandler(); + this IFilterProviderDescriptor descriptor) + { + descriptor.AddFieldHandler(QueryableSpatialGeometryDataHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialBufferDataHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialContainsOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialNotContainsOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialDistanceOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialIntersectsOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialNotIntersectsOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialOverlapsOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialNotOverlapsOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialTouchesOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialNotTouchesOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialWithinOperationHandler.Create); + descriptor.AddFieldHandler(QueryableSpatialNotWithinOperationHandler.Create); + + return descriptor; + } } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialBufferDataHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialBufferDataHandler.cs index 35c3185937a..7725531f633 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialBufferDataHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialBufferDataHandler.cs @@ -6,4 +6,6 @@ public class QueryableSpatialBufferDataHandler : QueryableDataOperationHandler { protected override int Operation => SpatialFilterOperations.Buffer; + + public new static QueryableSpatialBufferDataHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialContainsOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialContainsOperationHandler.cs index c101a787b24..d2bc32e0f47 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialContainsOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialContainsOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialContainsOperationHandler( protected override int Operation => SpatialFilterOperations.Contains; protected override bool IsTrue => true; + + public static QueryableSpatialContainsOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialDistanceOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialDistanceOperationHandler.cs index b036e102bb4..1e3dc3539e9 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialDistanceOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialDistanceOperationHandler.cs @@ -48,4 +48,7 @@ protected override bool TryHandleOperation( result = null; return false; } + + public static QueryableSpatialDistanceOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialGeometryDataHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialGeometryDataHandler.cs index bdcbadcd70f..4018912cbc6 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialGeometryDataHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialGeometryDataHandler.cs @@ -5,4 +5,6 @@ namespace HotChocolate.Data.Filters.Spatial; public class QueryableSpatialGeometryDataHandler : QueryableDataOperationHandler { protected override int Operation => SpatialFilterOperations.Geometry; + + public new static QueryableSpatialGeometryDataHandler Create(FilterProviderContext context) => new(); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialIntersectOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialIntersectOperationHandler.cs index 4fbe219be1b..5afc305de0c 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialIntersectOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialIntersectOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialIntersectsOperationHandler( protected override int Operation => SpatialFilterOperations.Intersects; protected override bool IsTrue => true; + + public static QueryableSpatialIntersectsOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotContainsOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotContainsOperationHandler.cs index eebd2b274e5..ff783dd2885 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotContainsOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotContainsOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialNotContainsOperationHandler( protected override int Operation => SpatialFilterOperations.NotContains; protected override bool IsTrue => false; + + public static QueryableSpatialNotContainsOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotIntersectsOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotIntersectsOperationHandler.cs index 09f2ff18392..3871c6e8804 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotIntersectsOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotIntersectsOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialNotIntersectsOperationHandler( protected override int Operation => SpatialFilterOperations.NotIntersects; protected override bool IsTrue => false; + + public static QueryableSpatialNotIntersectsOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotOverlapsOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotOverlapsOperationHandler.cs index 69842776799..07571cef76d 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotOverlapsOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotOverlapsOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialNotOverlapsOperationHandler( protected override int Operation => SpatialFilterOperations.NotOverlaps; protected override bool IsTrue => false; + + public static QueryableSpatialNotOverlapsOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotTouchesOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotTouchesOperationHandler.cs index 3811eb060fe..27f0437bd31 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotTouchesOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotTouchesOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialNotTouchesOperationHandler( protected override int Operation => SpatialFilterOperations.NotTouches; protected override bool IsTrue => false; + + public static QueryableSpatialNotTouchesOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotWithinOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotWithinOperationHandler.cs index 80034383ca0..6f3ead3a6f1 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotWithinOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialNotWithinOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialNotWithinOperationHandler( protected override int Operation => SpatialFilterOperations.NotWithin; protected override bool IsTrue => false; + + public static QueryableSpatialNotWithinOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialOverlapsOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialOverlapsOperationHandler.cs index 250f9c38b8b..f246afd8d68 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialOverlapsOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialOverlapsOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialOverlapsOperationHandler( protected override int Operation => SpatialFilterOperations.Overlaps; protected override bool IsTrue => true; + + public static QueryableSpatialOverlapsOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialTouchesOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialTouchesOperationHandler.cs index 2bc57925e0e..afd9b78a65c 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialTouchesOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialTouchesOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialTouchesOperationHandler( protected override int Operation => SpatialFilterOperations.Touches; protected override bool IsTrue => true; + + public static QueryableSpatialTouchesOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialWithinOperationHandler.cs b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialWithinOperationHandler.cs index 863a2f67dba..a191952efb2 100644 --- a/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialWithinOperationHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Filters/Expressions/Handlers/QueryableSpatialWithinOperationHandler.cs @@ -17,4 +17,7 @@ public QueryableSpatialWithinOperationHandler( protected override int Operation => SpatialFilterOperations.Within; protected override bool IsTrue => true; + + public static QueryableSpatialWithinOperationHandler Create(FilterProviderContext context) => + new(context.FilterConvention, context.TypeInspector, context.InputParser); } diff --git a/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs b/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs index 59bac5c8073..eb12a153655 100644 --- a/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs @@ -11,4 +11,6 @@ public class QueryableSpatialProjectionScalarHandler public override bool CanHandle(ISelection selection) => selection.Field.Member is not null && typeof(Geometry).IsAssignableFrom(selection.Field.Member.GetReturnType()); + + public new static QueryableSpatialProjectionScalarHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs b/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs index 9d955527b77..6ae3ab180ce 100644 --- a/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs +++ b/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/SpatialFilterProviderDescriptorQueryableExtensions.cs @@ -4,5 +4,5 @@ public static class SpatialProjectionProviderDescriptorQueryableExtensions { public static IProjectionProviderDescriptor AddSpatialHandlers( this IProjectionProviderDescriptor descriptor) => - descriptor.RegisterFieldHandler(); + descriptor.RegisterFieldHandler(QueryableSpatialProjectionScalarHandler.Create); } diff --git a/src/HotChocolate/Utilities/src/Utilities/DependencyInjection/CombinedServiceProvider.cs b/src/HotChocolate/Utilities/src/Utilities/DependencyInjection/CombinedServiceProvider.cs deleted file mode 100644 index eae8dbac6b7..00000000000 --- a/src/HotChocolate/Utilities/src/Utilities/DependencyInjection/CombinedServiceProvider.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System.Collections; -using Microsoft.Extensions.DependencyInjection; - -namespace HotChocolate.Utilities; - -internal sealed class CombinedServiceProvider : IServiceProvider -{ - private static List? s_buffer = []; - private static readonly Type s_enumerable = typeof(IEnumerable<>); - private readonly IServiceProvider _first; - private readonly IServiceProvider _second; - private readonly IServiceProviderIsService? _serviceInspector; - - public CombinedServiceProvider(IServiceProvider first, IServiceProvider second) - { - _first = first ?? throw new ArgumentNullException(nameof(first)); - _second = second ?? throw new ArgumentNullException(nameof(second)); - - var firstInspector = _first.GetService(); - var secondInspector = _second.GetService(); - - if (firstInspector is not null && secondInspector is not null) - { - _serviceInspector = new CombinedServiceProviderIsService(firstInspector, secondInspector); - } - } - - public object? GetService(Type serviceType) - { - ArgumentNullException.ThrowIfNull(serviceType); - - if (serviceType == typeof(IServiceProviderIsService)) - { - return _serviceInspector; - } - - if (serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == s_enumerable) - { - var elementType = serviceType.GetGenericArguments()[0]; - var firstResult = (IEnumerable?)_first.GetService(serviceType); - var secondResult = (IEnumerable?)_second.GetService(serviceType); - return Concat(elementType, firstResult, secondResult); - } - - return _first.GetService(serviceType) ?? _second.GetService(serviceType); - } - - private static object? Concat( - Type elementType, - IEnumerable? servicesFromA, - IEnumerable? servicesFromB) - { - if (servicesFromA is null) - { - return servicesFromB; - } - - if (servicesFromB is null) - { - return servicesFromA; - } - - var enumeratorA = servicesFromA.GetEnumerator(); - var disposableA = enumeratorA as IDisposable; - var enumeratorB = servicesFromB.GetEnumerator(); - var disposableB = enumeratorB as IDisposable; - - try - { - var buffer = Interlocked.Exchange(ref s_buffer, null) ?? []; - - while (enumeratorA.MoveNext()) - { - if (enumeratorA.Current is not null) - { - buffer.Add(enumeratorA.Current); - } - } - - while (enumeratorB.MoveNext()) - { - if (enumeratorB.Current is not null) - { - buffer.Add(enumeratorB.Current); - } - } - - var array = Array.CreateInstance(elementType, buffer.Count); - - for (var i = 0; i < buffer.Count; i++) - { - array.SetValue(buffer[i], i); - } - - buffer.Clear(); - Interlocked.CompareExchange(ref buffer, buffer, null); - - return array; - } - finally - { - disposableA?.Dispose(); - disposableB?.Dispose(); - } - } - - private sealed class CombinedServiceProviderIsService( - IServiceProviderIsService first, - IServiceProviderIsService second) - : IServiceProviderIsService - { - public bool IsService(Type serviceType) - => first.IsService(serviceType) - || second.IsService(serviceType); - } -} diff --git a/src/HotChocolate/Utilities/src/Utilities/DependencyInjection/DictionaryServiceProvider.cs b/src/HotChocolate/Utilities/src/Utilities/DependencyInjection/DictionaryServiceProvider.cs deleted file mode 100644 index 7af1d6a1a2d..00000000000 --- a/src/HotChocolate/Utilities/src/Utilities/DependencyInjection/DictionaryServiceProvider.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace HotChocolate.Utilities; - -public sealed class DictionaryServiceProvider : IServiceProvider, IServiceProviderIsService -{ - private readonly Dictionary _services; - - public DictionaryServiceProvider(Type service, object instance) - { - ArgumentNullException.ThrowIfNull(service); - ArgumentNullException.ThrowIfNull(instance); - - _services = new Dictionary { { service, instance } }; - _services[typeof(IServiceProviderIsService)] = this; - } - - public DictionaryServiceProvider(params KeyValuePair[] services) - { - ArgumentNullException.ThrowIfNull(services); - - _services = services.ToDictionary(t => t.Key, t => t.Value); - _services[typeof(IServiceProviderIsService)] = this; - } - - public DictionaryServiceProvider(params (Type, object)[] services) - { - ArgumentNullException.ThrowIfNull(services); - - _services = services.ToDictionary(t => t.Item1, t => t.Item2); - _services[typeof(IServiceProviderIsService)] = this; - } - - public DictionaryServiceProvider(IEnumerable> services) - { - ArgumentNullException.ThrowIfNull(services); - - _services = services.ToDictionary(t => t.Key, t => t.Value); - _services[typeof(IServiceProviderIsService)] = this; - } - - public object? GetService(Type serviceType) - => _services.TryGetValue(serviceType, out var service) ? service : null; - - public bool IsService(Type serviceType) - => _services.ContainsKey(serviceType); -} diff --git a/src/HotChocolate/Utilities/test/Utilities.Tests/CombinedServiceProviderTests.cs b/src/HotChocolate/Utilities/test/Utilities.Tests/CombinedServiceProviderTests.cs deleted file mode 100644 index cf78edfa531..00000000000 --- a/src/HotChocolate/Utilities/test/Utilities.Tests/CombinedServiceProviderTests.cs +++ /dev/null @@ -1,85 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace HotChocolate.Utilities; - -public class CombinedServiceProviderTests -{ - [Fact] - public void CombineServiceCollections() - { - var servicesA = new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); - - var servicesB = new ServiceCollection() - .AddSingleton() - .AddSingleton() - .BuildServiceProvider(); - - var combinedServices = new CombinedServiceProvider(servicesA, servicesB); - - Assert.Collection( - combinedServices.GetServices(), - t => Assert.IsType(t), - t => Assert.IsType(t), - t => Assert.IsType(t)); - } - - [Fact] - public void CombineServiceCollections_2() - { - var servicesA = new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); - - var servicesB = new ServiceCollection() - .AddSingleton() - .AddSingleton() - .BuildServiceProvider(); - - var combinedServices = new CombinedServiceProvider(servicesB, servicesA); - - Assert.Collection( - combinedServices.GetServices(), - t => Assert.IsType(t), - t => Assert.IsType(t), - t => Assert.IsType(t)); - } - - [Fact] - public void GetServiceWithoutError() - { - /*** - Note - ========== - This code is adapted from `HotChocolate.SchemaBuilder.Setup.InitializeInterceptors`, - which was the next relevant call down "down the stack" in the error traces which - motivate changes to the subject-under-test (i.e. CombinedServiceProvider). - ***/ - IServiceProvider stringServices = new DictionaryServiceProvider( - (typeof(IEnumerable), new List(["one", "two"]))); - - IServiceProvider numberServices = new DictionaryServiceProvider( - (typeof(IEnumerable), new List([1, 2, 3, 4, 5]))); - - IServiceProvider services = new CombinedServiceProvider(stringServices, numberServices); - - switch (services.GetService>()) - { - case null: - throw new Exception("Could not locate service!"); - - case var target: - Assert.Equal(15, target.Sum()); - break; - } - } - - private interface IService; - - private sealed class ServiceA : IService; - - private sealed class ServiceB : IService; - - private sealed class ServiceC : IService; -} diff --git a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md index 1bb2177a3af..68d903f035e 100644 --- a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md +++ b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md @@ -38,6 +38,47 @@ builder.Services.AddGraphQLServer() .ModifyOptions(options => options.LazyInitialization = true); ``` +## Clearer separation between schema and application services + +Hot Chocolate has long maintained a second `IServiceProvider` for schema services, separate from the application service provider where you register your services and configuration. This schema service provider is scoped to a particular schema and contains all of Hot Chocolate's internal services. + +To access application services within schema services like diagnostic event listeners or error filters, we previously used a combined service provider for activating various Hot Chocolate components. However, this approach made it difficult to track service origins and created challenges for AOT compatibility. + +Starting with v16, we're introducing a more explicit model where Hot Chocolate configuration is instantiated exclusively through the internal schema service provider. Application services must now be explicitly cross-registered in the schema service provider to be accessible. + +```diff +builder.Services.AddSingleton(); +builder.Services.AddGraphQLServer() ++ .AddApplicationService() + .AddDiagnosticEventListener() + // or + .AddDiagnosticEventListener(sp => new MyService(sp.GetRequiredService())); + +public class MyDiagnosticEventListener(MyService service) : ExecutionDiagnosticEventListener; +``` + +Services registered via `AddApplicationService()` are resolved once during schema initialization from the application service provider and registered as singletons in the schema service provider. + +If you're using any of the following configuration APIs, ensure that the application services required for their activation are registered via `AddApplicationService()`: + +- `AddHttpRequestInterceptor` +- `AddSocketSessionInterceptor` +- `AddErrorFilter` +- `AddDiagnosticEventListener` +- `AddOperationCompilerOptimizer` +- `AddTransactionScopeHandler` +- `AddRedisOperationDocumentStorage` +- `AddAzureBlobStorageOperationDocumentStorage` +- `AddInstrumentation` with a custom `ActivityEnricher` + +**Note:** Service injection into resolvers is not affected by this change. + +If you need to access the application service provider from within the schema service provider, you can use: + +```csharp +IServiceProvider applicationServices = schemaServices.GetRootServiceProvider(); +``` + ## Cache size configuration Previously, document and operation cache sizes were globally configured through the `IServiceCollection`. In an effort to align and properly scope our configuration APIs, we've moved the configuration of these caches to the `IRequestExecutorBuilder`. If you're currently calling `AddDocumentCache` or `AddOperationCache` directly on the `IServiceCollection`, move the configuration to `ModifyOptions` on the `IRequestExecutorBuilder`: diff --git a/website/src/docs/hotchocolate/v16/server/instrumentation.md b/website/src/docs/hotchocolate/v16/server/instrumentation.md index 5d83a022cdb..5be0deeb5aa 100644 --- a/website/src/docs/hotchocolate/v16/server/instrumentation.md +++ b/website/src/docs/hotchocolate/v16/server/instrumentation.md @@ -371,6 +371,9 @@ Register the custom activity enricher as a singleton: ```csharp builder.Services.AddSingleton(); + +builder.Services.AddGraphQLServer() + .AddApplicationService(); ``` ![Jaeger](../../../shared/jaeger4.png)