コード例 #1
0
 internal static FieldType CreateFieldType <TResolvedType>(LiteralGraphTypeMemberInfo member)
     where TResolvedType : IGraphType, new()
 {
     return(new FieldType
     {
         Name = member.Name,
         Type = typeof(TResolvedType),
         Resolver = CreateFieldResolverFor(member)
     });
 }
コード例 #2
0
        internal static FieldTypeResolver MakeFieldTypeResolverForMember(LiteralGraphTypeMemberInfo member, FieldTypeResolver complexFieldTypeResolver)
        {
            var type = member.Type;

            if (type == LiteralGraphTypeMemberInfoType.Complex)
            {
                return(complexFieldTypeResolver);
            }

            LiteralGraphTypeMemberInfoFieldTypeResolverMappings.TryGetValue(type, out var resolver);

            return(resolver);
        }
コード例 #3
0
        internal static FieldTypeResolver GetFieldTypeResolverForMember(LiteralGraphTypeMemberInfo member, FieldTypeResolver complexFieldTypeResolver)
        {
            var memberFieldTypeResolverMapKey = MakeMemberFieldTypeResolverMapKey(member);

            // If we don't already know the fieldtype resolver for this member, we need to figure it out
            if (!MemberFieldTypeResolverMappings.TryGetValue(memberFieldTypeResolverMapKey, out var fieldTypeResolver) || fieldTypeResolver == null)
            {
                // Try to create a new field type resolver
                fieldTypeResolver = MakeFieldTypeResolverForMember(member, complexFieldTypeResolver);
                if (fieldTypeResolver == null)
                {
                    return(null);
                }

                // Save the resolver
                MemberFieldTypeResolverMappings.AddOrUpdate(memberFieldTypeResolverMapKey, fieldTypeResolver, (m, old) => fieldTypeResolver);
            }

            return(fieldTypeResolver);
        }
コード例 #4
0
        internal static FieldType GetFieldTypeForMember(LiteralGraphTypeMemberInfo member, FieldTypeResolver complexFieldTypeResolver)
        {
            var memberFieldTypeMapKey = MakeMemberFieldTypeMapKey(member);

            // Try to find an existing FieldType for this member
            if (!MemberFieldTypeMappings.TryGetValue(memberFieldTypeMapKey, out var fieldType))
            {
                // Throw a new FieldType in to indicate we're in the middle of resolving a FieldType
                fieldType = new FieldType();
                MemberFieldTypeMappings.AddOrUpdate(memberFieldTypeMapKey, fieldType, (m, old) => fieldType);

                // Get the fieldtype resolver
                var fieldTypeResolver = GetFieldTypeResolverForMember(member, complexFieldTypeResolver);

                // Execute the resolver
                var actualFieldType = fieldTypeResolver(member);

                // Copy over fields
                PatchFieldType(fieldType, actualFieldType);
            }

            return(fieldType);
        }
コード例 #5
0
 internal static IFieldResolver CreateFieldResolverFor(LiteralGraphTypeMemberInfo member)
 {
     return(new FuncFieldResolver <object>(ctx => member.GetValueFn(ctx)));
 }
コード例 #6
0
 private static string MakeMemberFieldTypeMapKey(LiteralGraphTypeMemberInfo member) => $"{member.DeclaringTypeName}.{member.Name}";
コード例 #7
0
 internal static string MakeMemberFieldTypeResolverMapKey(LiteralGraphTypeMemberInfo member) => $"{member.DeclaringTypeName}.{member.Name}";