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); } }
public void Generic_Test_AddType_HasDynamicallyCreatedModel <T>() { initializer.Init(); initializer.services.AddGraphQL() .Type <T>() .Build(); var dynamicallyCreatedClass = GraphQLCoreTypeWrapperGenerator.GetDerivedGenericUserType <GenericType <T> >(); Assert.IsNotNull(dynamicallyCreatedClass); }
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); } }
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(); }
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)); } }
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); }
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); }