コード例 #1
0
            protected override void Configure(IObjectTypeDescriptor descriptor)
            {
                descriptor.Name("Query")
                .Field("words")
                .Type <ListType <ObjectType <Word> > >()
                .Resolver(
                    new Word[] { new Word {
                                     Value = "Hello"
                                 }, new Word {
                                     Value = "World"
                                 } })
                .Extend()
                .OnBeforeCreate(d =>
                {
                    var reference = TypeReference.Create(typeof(Word), TypeContext.Output);

                    ILazyTypeConfiguration lazyConfiguration =
                        LazyTypeConfigurationBuilder
                        .New <ObjectFieldDefinition>()
                        .Definition(d)
                        .Configure((context, definition) =>
                    {
                        ObjectType type = context.GetType <ObjectType>(reference);
                        if (!type.IsCompleted)
                        {
                            throw new Exception("Order should not matter");
                        }
                    })
                        .On(ApplyConfigurationOn.Completion)
                        .DependsOn(reference, true)
                        .Build();

                    d.Configurations.Add(lazyConfiguration);
                });
            }
コード例 #2
0
        private static IObjectFieldDescriptor ApplyMiddleware(
            this IObjectFieldDescriptor descriptor,
            string optionName,
            Type middlewareDefinition)
        {
            if (descriptor is null)
            {
                throw new ArgumentNullException(nameof(descriptor));
            }

            FieldMiddleware placeholder = next => context => default;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(
                (context, definition) =>
            {
                definition.ContextData[optionName] = null;

                if (definition.ResultType is null ||
                    !context.TypeInspector.TryCreateTypeInfo(
                        definition.ResultType,
                        out ITypeInfo? typeInfo))
                {
                    Type resultType = definition.ResolverType ?? typeof(object);
                    throw new ArgumentException(
                        $"Cannot handle the specified type `{resultType.FullName}`.",
                        nameof(descriptor));
                }

                Type selectionType    = typeInfo.NamedType;
                definition.ResultType = selectionType;
                definition.Type       = RewriteToNonNullableType(
                    context.TypeInspector,
                    definition.Type);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure(
                        (_, __) =>
                {
                    CompileMiddleware(
                        selectionType,
                        definition,
                        placeholder,
                        middlewareDefinition);
                })
                    .On(ApplyConfigurationOn.Completion)
                    .Build();

                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #3
0
        public static IObjectFieldDescriptor UseAutoMapperProjection(
            this IObjectFieldDescriptor descriptor,
            Type objectType)
        {
            FieldMiddleware placeholder = next => context => default;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(
                (context, definition) =>
            {
                if (definition.ResultType is null ||
                    !context.TypeInspector.TryCreateTypeInfo(
                        definition.ResultType,
                        out ITypeInfo? typeInfo))
                {
                    Type resultType = definition.ResolverType ?? typeof(object);
                    throw new ArgumentException(
                        $"Cannot handle the specified type `{resultType.FullName}`.",
                        nameof(descriptor));
                }

                if (!typeof(IQueryable).IsAssignableFrom(definition.ResultType))
                {
                    throw new ArgumentException(
                        $"Cannot handle the specified type `{definition.ResultType.FullName}`.",
                        nameof(descriptor));
                }

                Type selectionType    = typeInfo.NamedType;
                definition.ResultType = typeof(IQueryable <>).MakeGenericType(objectType);
                definition.Type       = context.TypeInspector.GetTypeRef(definition.ResultType);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure(
                        (_, __) =>
                {
                    CompileMiddleware(
                        selectionType,
                        objectType,
                        definition,
                        placeholder,
                        _middlewareDefinition);
                })
                    .On(ApplyConfigurationOn.Completion)
                    .Build();

                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #4
0
        /// <summary>
        /// Projects the selection set of the request onto the field. Registers a middleware that
        /// uses the registered <see cref="ProjectionConvention"/> to apply the projections
        /// </summary>
        /// <param name="descriptor">The descriptor</param>
        /// <param name="scope">
        /// Specify which <see cref="ProjectionConvention"/> is used, based on the value passed in
        /// <see cref="ProjectionsSchemaBuilderExtensions.AddProjections{T}"/>
        /// </param>
        /// <param name="type">
        /// The <see cref="Type"/> of the resolved field
        /// </param>
        /// <returns>The descriptor passed in by <paramref name="descriptor"/></returns>
        /// <exception cref="ArgumentNullException">
        /// In case the descriptor is null
        /// </exception>
        public static IObjectFieldDescriptor UseProjection(
            this IObjectFieldDescriptor descriptor,
            Type?type,
            string?scope = null)
        {
            if (descriptor is null)
            {
                throw new ArgumentNullException(nameof(descriptor));
            }

            FieldMiddleware placeholder = next => context => default;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(
                (context, definition) =>
            {
                Type?selectionType = type;

                if (selectionType is null)
                {
                    if (definition.ResultType is null ||
                        !context.TypeInspector.TryCreateTypeInfo(
                            definition.ResultType,
                            out ITypeInfo? typeInfo))
                    {
                        throw new ArgumentException(
                            "Cannot handle the specified type.",
                            nameof(descriptor));
                    }

                    selectionType = typeInfo.NamedType;
                }

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure(
                        (context, definition) =>
                        CompileMiddleware(
                            selectionType,
                            definition,
                            placeholder,
                            context,
                            scope))
                    .On(ApplyConfigurationOn.Completion)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #5
0
        public static IObjectFieldDescriptor UseSorting(
            this IObjectFieldDescriptor descriptor,
            Type sortType,
            ITypeSystemMember sortTypeInstance = null)
        {
            FieldMiddleware placeholder =
                next => context => Task.CompletedTask;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(definition =>
            {
                Type argumentType = GetArgumentType(definition, sortType);

                ITypeReference argumentTypeReference =
                    sortTypeInstance is null
                            ? (ITypeReference) new ClrTypeReference(
                        argumentType, TypeContext.Input)
                            : new SchemaTypeReference(sortTypeInstance);

                var argumentDefinition = new ArgumentDefinition
                {
                    Name = OrderByArgumentName,
                    Type = new ClrTypeReference(
                        argumentType, TypeContext.Input)
                };
                definition.Arguments.Add(argumentDefinition);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure((context, defintion) =>
                               CompileMiddleware(
                                   context,
                                   definition,
                                   argumentTypeReference,
                                   placeholder))
                    .On(ApplyConfigurationOn.Completion)
                    .DependsOn(argumentTypeReference, true)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #6
0
        private static IObjectFieldDescriptor UseSelection(
            IObjectFieldDescriptor descriptor,
            Type?objectType)
        {
            FieldMiddleware placeholder =
                next => context => Task.CompletedTask;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(definition =>
            {
                Type?selectionType = objectType;

                if (selectionType == null)
                {
                    if (!TypeInspector.Default.TryCreate(
                            definition.ResultType, out TypeInfo typeInfo))
                    {
                        // TODO : resources
                        throw new ArgumentException(
                            "Cannot handle the specified type.",
                            nameof(descriptor));
                    }

                    selectionType = typeInfo.ClrType;
                }

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure((context, defintion) =>
                               CompileMiddleware(
                                   selectionType,
                                   definition,
                                   placeholder,
                                   context))
                    .On(ApplyConfigurationOn.Completion)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #7
0
        private static ArgumentDefinition ConfigureArgumentName(
            this ArgumentDefinition definition)
        {
            ILazyTypeConfiguration lazyArgumentConfiguration =
                LazyTypeConfigurationBuilder
                .New <ArgumentDefinition>()
                .Definition(definition)
                .Configure((context, definition) =>
            {
                IFilterNamingConvention convention = context.DescriptorContext.GetFilterNamingConvention();
                definition.Name = convention.ArgumentName;
            })
                .On(ApplyConfigurationOn.Completion)
                .Build();

            definition.Configurations.Add(lazyArgumentConfiguration);
            return(definition);
        }
コード例 #8
0
        private static IObjectFieldDescriptor UseFiltering(
            IObjectFieldDescriptor descriptor,
            Type filterType,
            ITypeSystemMember filterTypeInstance = null)
        {
            FieldMiddleware placeholder =
                next => context => Task.CompletedTask;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(definition =>
            {
                Type argumentType = filterType;

                if (filterType == null)
                {
                    if (!TypeInspector.Default.TryCreate(
                            definition.ResultType, out TypeInfo typeInfo))
                    {
                        // TODO : resources
                        throw new ArgumentException(
                            "Cannot handle the specified type.",
                            nameof(descriptor));
                    }

                    argumentType =
                        typeof(FilterInputType <>).MakeGenericType(
                            typeInfo.ClrType);
                }

                var argumentTypeReference = filterTypeInstance is null
                        ? (ITypeReference) new ClrTypeReference(
                    argumentType, TypeContext.Input)
                        : new SchemaTypeReference(filterTypeInstance);

                if (argumentType == typeof(object))
                {
                    // TODO : resources
                    throw new SchemaException(
                        SchemaErrorBuilder.New()
                        .SetMessage(
                            "The filter type cannot be " +
                            "infered from `System.Object`.")
                        .SetCode(ErrorCodes.Filtering.FilterObjectType)
                        .Build());
                }

                var argumentDefinition  = new ArgumentDefinition();
                argumentDefinition.Name = _whereArgumentName;
                argumentDefinition.Type = new ClrTypeReference(
                    argumentType, TypeContext.Input);
                definition.Arguments.Add(argumentDefinition);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure((context, defintion) =>
                               CompileMiddleware(
                                   context,
                                   definition,
                                   argumentTypeReference,
                                   placeholder))
                    .On(ApplyConfigurationOn.Completion)
                    .DependsOn(argumentTypeReference, true)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #9
0
        public static IObjectFieldDescriptor UseSorting(
            this IObjectFieldDescriptor descriptor,
            Type?sortType,
            ITypeSystemMember?sortTypeInstance = null)
        {
            FieldMiddleware placeholder         = next => context => default;
            string          argumentPlaceholder =
                "_" + Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate((c, definition) =>
            {
                Type argumentType = GetArgumentType(definition, sortType, c.TypeInspector);

                ITypeReference argumentTypeReference = sortTypeInstance is null
                        ? (ITypeReference)c.TypeInspector.GetTypeRef(
                    argumentType,
                    TypeContext.Input)
                        : TypeReference.Create(sortTypeInstance);

                var argumentDefinition = new ArgumentDefinition
                {
                    Name = argumentPlaceholder,
                    Type = c.TypeInspector.GetTypeRef(argumentType, TypeContext.Input)
                };

                ILazyTypeConfiguration lazyArgumentConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ArgumentDefinition>()
                    .Definition(argumentDefinition)
                    .Configure((context, definition) =>
                {
                    ISortingNamingConvention convention =
                        context.DescriptorContext.GetSortingNamingConvention();
                    definition.Name = convention.ArgumentName;
                })
                    .On(ApplyConfigurationOn.Completion)
                    .Build();

                argumentDefinition.Configurations.Add(lazyArgumentConfiguration);
                definition.Arguments.Add(argumentDefinition);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure((context, definition) =>
                               CompileMiddleware(
                                   context,
                                   definition,
                                   argumentTypeReference,
                                   placeholder))
                    .On(ApplyConfigurationOn.Completion)
                    .DependsOn(argumentTypeReference, true)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #10
0
        private static IObjectFieldDescriptor UseFiltering(
            IObjectFieldDescriptor descriptor,
            Type?filterType,
            ITypeSystemMember?filterTypeInstance = null)
        {
            FieldMiddleware placeholder         = next => context => default;
            string          argumentPlaceholder =
                "_" + Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate((c, definition) =>
            {
                Type?argumentType = filterType;

                if (argumentType is null)
                {
                    if (definition.ResultType is null ||
                        definition.ResultType == typeof(object) ||
                        !c.TypeInspector.TryCreateTypeInfo(
                            definition.ResultType, out ITypeInfo? typeInfo))
                    {
                        throw new ArgumentException(
                            FilterResources.FilterObjectFieldDescriptor_InvalidType,
                            nameof(descriptor));
                    }

                    argumentType = typeof(FilterInputType <>)
                                   .MakeGenericType(typeInfo.NamedType);
                }

                ITypeReference argumentTypeReference = filterTypeInstance is null
                        ? (ITypeReference)c.TypeInspector.GetTypeRef(
                    argumentType,
                    TypeContext.Input)
                        : TypeReference.Create(filterTypeInstance);

                if (argumentType == typeof(object))
                {
                    throw new SchemaException(
                        SchemaErrorBuilder.New()
                        .SetMessage(
                            FilterResources.FilterObjectFieldDescriptor_InvalidType_Msg)
                        .SetCode(ErrorCodes.Filtering.FilterObjectType)
                        .Build());
                }

                var argumentDefinition = new ArgumentDefinition
                {
                    Name = argumentPlaceholder,
                    Type = c.TypeInspector.GetTypeRef(argumentType, TypeContext.Input)
                };

                argumentDefinition.ConfigureArgumentName();
                definition.Arguments.Add(argumentDefinition);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure((context, definition) =>
                               CompileMiddleware(
                                   context,
                                   definition,
                                   argumentTypeReference,
                                   placeholder))
                    .On(ApplyConfigurationOn.Completion)
                    .DependsOn(argumentTypeReference, true)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }
コード例 #11
0
        private static IObjectFieldDescriptor UseFiltering(
            IObjectFieldDescriptor descriptor,
            Type?filterType,
            ITypeSystemMember?filterTypeInstance = null)
        {
            FieldMiddleware placeholder =
                _ => _ => Task.CompletedTask;

            descriptor
            .Use(placeholder)
            .Extend()
            .OnBeforeCreate(definition =>
            {
                Type?argumentType = filterType;

                if (argumentType == null)
                {
                    if (!TypeInspector.Default.TryCreate(
                            definition.ResultType,
                            out TypeInfo typeInfo))
                    {
                        throw new ArgumentException(
                            FilterResources.FilterObjectFieldDescriptor_InvalidType,
                            nameof(descriptor));
                    }

                    argumentType = typeof(FilterInputType <>).MakeGenericType(typeInfo.ClrType);
                }

                ITypeReference argumentTypeReference =
                    filterTypeInstance is null
                            ? (ITypeReference) new ClrTypeReference(argumentType, TypeContext.Input)
                            : new SchemaTypeReference(filterTypeInstance);

                if (argumentType == typeof(object))
                {
                    throw new SchemaException(
                        SchemaErrorBuilder.New()
                        .SetMessage(
                            FilterResources.FilterObjectFieldDescriptor_InvalidType_Msg)
                        .SetCode(ErrorCodes.Filtering.FilterObjectType)
                        .Build());
                }

                var argumentDefinition = new ArgumentDefinition
                {
                    Type = new ClrTypeReference(argumentType, TypeContext.Input)
                };

                argumentDefinition.ConfigureArgumentName();
                definition.Arguments.Add(argumentDefinition);

                ILazyTypeConfiguration lazyConfiguration =
                    LazyTypeConfigurationBuilder
                    .New <ObjectFieldDefinition>()
                    .Definition(definition)
                    .Configure((context, definition) =>
                               CompileMiddleware(
                                   context,
                                   definition,
                                   argumentTypeReference,
                                   placeholder))
                    .On(ApplyConfigurationOn.Completion)
                    .DependsOn(argumentTypeReference, true)
                    .Build();
                definition.Configurations.Add(lazyConfiguration);
            });

            return(descriptor);
        }