示例#1
0
        public GenericType(IGraphQLBuilder builder = null)
        {
            try
            {
                var typedClass = typeof(T);
                var props      = typedClass.GetProperties();
                foreach (var prop in props)
                {
                    Type propGraphQLType = null;

                    propGraphQLType = prop.PropertyType.TryConvertToGraphQLType();

                    if (propGraphQLType != null && GraphQLExtensions.IsExtendedGraphQLType(propGraphQLType))
                    {
                        var resolvedType = propGraphQLType;
                        builder
                        .GetType()
                        .GetInterface("IGraphQLBuilder")
                        .GetMethod("Type")
                        .MakeGenericMethod(resolvedType)
                        .Invoke(builder, null);
                    }
                    else if (propGraphQLType is null)
                    {
                        var resolvedType = propGraphQLType ?? prop.PropertyType;

                        builder
                        .GetType()
                        .GetInterface("IGraphQLBuilder")
                        .GetMethod("Type")
                        .MakeGenericMethod(resolvedType)
                        .Invoke(builder, null);

                        propGraphQLType = typeof(GenericType <>).MakeGenericType(resolvedType);

                        if (propGraphQLType is null)
                        {
                            throw new InvalidCastException(
                                      $"{prop.Name} was not automatically convertible into a GraphQL type. " +
                                      $"Try explicitly adding this Type through the GraphQL-Core middleware.");
                        }

                        propGraphQLType = GraphQLCoreTypeWrapperGenerator.GetDerivedGenericUserType(propGraphQLType);

                        if (propGraphQLType is null)
                        {
                            throw new NotSupportedException(
                                      $"{prop.Name} is a custom type but was not registered through builder. " +
                                      $"Try explicitly adding this Type through the Graph-Core middleware");
                        }
                    }

                    Field(propGraphQLType, prop.Name);
                }
            }
            catch (Exception e)
            {
                throw new GraphQLCoreTypeException($"An attempt to create a generic type for type {nameof(T)} failed. Refer to inner exception for details", e);
            }
        }
示例#2
0
        public void Generic_Test_AddType_HasDynamicallyCreatedModel <T>()
        {
            initializer.Init();
            initializer.services.AddGraphQL()
            .Type <T>()
            .Build();

            var dynamicallyCreatedClass = GraphQLCoreTypeWrapperGenerator.GetDerivedGenericUserType <GenericType <T> >();

            Assert.IsNotNull(dynamicallyCreatedClass);
        }
示例#3
0
        public void Generic_Test_AddType_IsQueryable <T>()
        {
            initializer.Init();
            var builder = initializer.services.AddGraphQL()
                          .Type <T>();

            foreach (var field in typeof(T).GetProperties())
            {
                GraphQLQuery defaultQuery =
                    () => new Query()
                {
                    Expression = $"get_{field.Name}",
                    Resolver   = (context) =>
                                 field.PropertyType.DefaultUnknownProperty()
                };

                var methodInfo = builder
                                 .GetType()
                                 .GetInterface("IGraphQLBuilder")
                                 .GetMethod("Query");

                methodInfo
                .MakeGenericMethod(field.PropertyType)
                .Invoke(
                    builder,
                    new object[] { defaultQuery });
            }

            builder.Build();

            var dynamicallyCreatedClass = GraphQLCoreTypeWrapperGenerator.GetDerivedGenericUserType <GenericType <T> >();

            Assert.IsNotNull(dynamicallyCreatedClass);

            var userModelInstance = initializer.resolver.Resolve(dynamicallyCreatedClass) as GenericType <T>;

            foreach (var field in typeof(T).GetProperties())
            {
                Assert.IsTrue(userModelInstance.HasField(field.Name));

                var subFields = TestExtensions.ConstructSubFieldSelector(field.PropertyType, "");

                //add sub-selection is field is class, use all props
                (var hasError, var result) = initializer.Ask($@"
                    {{
                        get_{field.Name} {subFields}
                    }}
                ");

                Assert.IsFalse(hasError);
            }
        }
示例#4
0
        public void Init()
        {
            services = new ServiceCollection();
            provider = services.BuildServiceProvider();
            executer = new DocumentExecuter();
            resolver = new FuncDependencyResolver(type =>
            {
                var service = services.Where(svc => svc.ServiceType == type).FirstOrDefault();
                if (service is null || service.ImplementationInstance is null)
                {
                    return(provider.GetService(type));
                }

                return(service.ImplementationInstance);
            });
            GraphQLCoreTypeWrapperGenerator.Clear();
        }
示例#5
0
        public void Generic_Test_AddType_HasFields <T>()
        {
            initializer.Init();
            initializer.services.AddGraphQL()
            .Type <T>()
            .Build();

            var dynamicallyCreatedClass = GraphQLCoreTypeWrapperGenerator.GetDerivedGenericUserType <GenericType <T> >();

            Assert.IsNotNull(dynamicallyCreatedClass);

            var userModelInstance = initializer.resolver.Resolve(dynamicallyCreatedClass) as GenericType <T>;

            Assert.IsNotNull(userModelInstance);

            foreach (var field in typeof(T).GetProperties())
            {
                Assert.IsTrue(userModelInstance.HasField(field.Name));
            }
        }
示例#6
0
        IGraphQLBuilder IGraphQLBuilder.Stitch <A, BResult>(
            string expr,
            Expression <Func <A, object> > joinOn,
            Func <
                Func <object,
                      Func <
                          ResolveFieldContext <A>,
                          BResult> > > joinTo
            )
        {
            var userTypeA = GraphQLCoreTypeWrapperGenerator.CreateGraphQLTypeWrapper <A>();
            var userTypeB = typeof(BResult).GetBaseGraphQLType();

            GenericType <A> graphQlTypeAInstance;

            if (((IGraphQLBuilder)this).GraphQLTypes.ContainsKey(userTypeA))
            {
                graphQlTypeAInstance = (GenericType <A>)((IGraphQLBuilder)this).GraphQLTypes[userTypeA];
            }
            else
            {
                graphQlTypeAInstance = new GenericType <A>
                {
                    Name = typeof(A).Name
                };
                ((IGraphQLBuilder)this).GraphQLTypes.Add(userTypeA, graphQlTypeAInstance);
            }

            var propertyName = (joinOn.Body as MemberExpression ?? ((UnaryExpression)joinOn.Body).Operand as MemberExpression).Member.Name;

            graphQlTypeAInstance.Stitch(expr, propertyName, joinTo());

            //Remove references of A type from BResult
            var baseTypeOfBResult          = GraphQLCoreTypeWrapperGenerator.GetBaseGenericUserType(userTypeB);
            var storedObjectInstanceOfBase = ((IGraphQLBuilder)this).GraphQLTypes[userTypeB];

            baseTypeOfBResult
            .InvokeMember("RemoveFieldType", BindingFlags.InvokeMethod, null, storedObjectInstanceOfBase, new object[] { userTypeA });

            return(this);
        }
示例#7
0
        IGraphQLBuilder IGraphQLBuilder.Type <T>()
        {
            try
            {
                if (GraphQLExtensions.IsExtendedGraphQLType(typeof(T)))
                {
                    var type = typeof(T).IsGenericType ? typeof(T).GenericTypeArguments[0] : typeof(T);

                    if (((IGraphQLBuilder)this).GraphQLTypes.ContainsKey(typeof(T)))
                    {
                        return(this);
                    }

                    var graphQlTypeInstance = Activator.CreateInstance <T>();
                    ((IGraphQLBuilder)this).GraphQLTypes.Add(typeof(T), graphQlTypeInstance);
                }
                else
                {
                    var userType = GraphQLCoreTypeWrapperGenerator.CreateGraphQLTypeWrapper <T>();

                    if (((IGraphQLBuilder)this).GraphQLTypes.ContainsKey(userType))
                    {
                        return(this);
                    }

                    var graphQlTypeInstance = new GenericType <T>(this)
                    {
                        Name = typeof(T).Name
                    };
                    ((IGraphQLBuilder)this).GraphQLTypes.Add(userType, graphQlTypeInstance);
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return(this);
        }