public void Build(FieldType contentQuery, ContentTypeDefinition contentTypeDefinition, ContentItemType contentItemType)
        {
            var serviceProvider       = _httpContextAccessor.HttpContext.RequestServices;
            var contentFieldProviders = serviceProvider.GetServices <IContentFieldProvider>().ToList();

            foreach (var part in contentTypeDefinition.Parts)
            {
                var partName = part.Name;

                // Check if another builder has already added a field for this part.
                if (contentItemType.HasField(partName))
                {
                    continue;
                }

                // This builder only handles parts with fields.
                if (!part.PartDefinition.Fields.Any())
                {
                    continue;
                }

                if (_contentOptions.ShouldSkip(part))
                {
                    continue;
                }

                if (_contentOptions.ShouldCollapse(part))
                {
                    foreach (var field in part.PartDefinition.Fields)
                    {
                        foreach (var fieldProvider in contentFieldProviders)
                        {
                            var fieldType = fieldProvider.GetField(field);

                            if (fieldType != null)
                            {
                                if (_contentOptions.ShouldSkip(fieldType.Type, fieldType.Name))
                                {
                                    continue;
                                }

                                contentItemType.AddField(fieldType);
                                break;
                            }
                        }
                    }
                }
                else
                {
                    var field = contentItemType.Field(
                        typeof(DynamicPartGraphType),
                        partName.ToFieldName(),
                        description: T["Represents a {0}.", part.PartDefinition.Name],
                        resolve: context =>
                    {
                        var nameToResolve = partName;
                        var typeToResolve = context.ReturnType.GetType().BaseType.GetGenericArguments().First();

                        return(context.Source.Get(typeToResolve, nameToResolve));
                    });

                    field.ResolvedType = new DynamicPartGraphType(_httpContextAccessor, part);
                }
            }
        }
        public void Build(FieldType contentQuery, ContentTypeDefinition contentTypeDefinition, ContentItemType contentItemType)
        {
            var serviceProvider = _httpContextAccessor.HttpContext.RequestServices;
            var typeActivator   = serviceProvider.GetService <ITypeActivatorFactory <ContentPart> >();

            foreach (var part in contentTypeDefinition.Parts)
            {
                if (_contentOptions.ShouldSkip(part))
                {
                    continue;
                }

                var partName = part.Name;

                // Check if another builder has already added a field for this part.
                if (contentItemType.HasField(partName))
                {
                    continue;
                }

                var activator = typeActivator.GetTypeActivator(part.PartDefinition.Name);

                var queryGraphType = typeof(ObjectGraphType <>).MakeGenericType(activator.Type);

                var collapsePart = _contentOptions.ShouldCollapse(part);

                if (serviceProvider.GetService(queryGraphType) is IObjectGraphType queryGraphTypeResolved)
                {
                    if (collapsePart)
                    {
                        foreach (var field in queryGraphTypeResolved.Fields)
                        {
                            if (_contentOptions.ShouldSkip(queryGraphType, field.Name))
                            {
                                continue;
                            }

                            var rolledUpField = new FieldType
                            {
                                Name              = field.Name,
                                Type              = field.Type,
                                Description       = field.Description,
                                DeprecationReason = field.DeprecationReason,
                                Arguments         = field.Arguments,
                                Resolver          = new FuncFieldResolver <ContentItem, object>(context =>
                                {
                                    var nameToResolve = partName;
                                    var resolvedPart  = context.Source.Get(activator.Type, nameToResolve);

                                    return(field.Resolver.Resolve(new ResolveFieldContext
                                    {
                                        Arguments = context.Arguments,
                                        Source = resolvedPart,
                                        FieldDefinition = field,
                                        UserContext = context.UserContext
                                    }));
                                })
                            };

                            contentItemType.AddField(rolledUpField);
                        }
                    }
                    else
                    {
                        contentItemType.Field(
                            queryGraphTypeResolved.GetType(),
                            partName.ToFieldName(),
                            description: queryGraphTypeResolved.Description,
                            resolve: context =>
                        {
                            var nameToResolve = partName;
                            var typeToResolve = context.ReturnType.GetType().BaseType.GetGenericArguments().First();

                            return(context.Source.Get(typeToResolve, nameToResolve));
                        });
                    }
                }

                var inputGraphType = typeof(InputObjectGraphType <>).MakeGenericType(activator.Type);

                if (serviceProvider.GetService(inputGraphType) is IInputObjectGraphType inputGraphTypeResolved)
                {
                    var whereArgument = contentQuery.Arguments.FirstOrDefault(x => x.Name == "where");
                    if (whereArgument == null)
                    {
                        return;
                    }

                    var whereInput = (ContentItemWhereInput)whereArgument.ResolvedType;

                    if (collapsePart)
                    {
                        foreach (var field in inputGraphTypeResolved.Fields)
                        {
                            whereInput.AddField(field.WithPartCollapsedMetaData().WithPartNameMetaData(partName));
                        }
                    }
                    else
                    {
                        whereInput.AddField(new FieldType
                        {
                            Type        = inputGraphTypeResolved.GetType(),
                            Name        = partName.ToFieldName(),
                            Description = inputGraphTypeResolved.Description
                        }.WithPartNameMetaData(partName));
                    }
                }
            }
        }