コード例 #1
0
        public void OnGraphInit(IObjectGraphType query, IObjectGraphType mutation)
        {
            var orderService = shopFactory.OrderService;
            //var orderResolver = new OrderResolver(orderService);
            var orderResolver = new FuncFieldResolver <IOrder>((ctx) => orderService.GetOrder(ctx.GetArgument <string>("id")));
            //var orderArticleResolver = new FuncFieldResolver<IEnumerable<IOrderArticle>>((ctx) => (ctx.Source as IOrder).Articles);

            var order        = shopFactory.CreateInstance <IOrder>();
            var orderArticle = shopFactory.CreateInstance <IOrderArticle>();

            GraphTypeTypeRegistry.Register(typeof(IOrderArticle), typeof(ReflectionObjectGraphType <IOrderArticle>));

            query.AddField(new FieldType()
            {
                Name = "orderarticle",
                //Resolver = orderResolver,
                Type         = orderArticle.GetType(),
                ResolvedType = new ReflectionObjectGraphType <IOrderArticle>()
            });

            query.AddField(new FieldType()
            {
                Name         = "order",
                Resolver     = orderResolver,
                Arguments    = TinyQuery.GetIdQuery(),
                Type         = order.GetType(),
                ResolvedType = new ReflectionObjectGraphType <IOrder>()
            });
        }
コード例 #2
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            //services.AddDbContext<BlogDbContext>(options =>
            //   options.UseSqlServer(Configuration.GetConnectionString("MainDatabase")));
            services.AddSingleton(_ => { return(BlogDbContextEfFactory.CreateDbContext(Configuration)); });
            EfGraphQLConventions.RegisterInContainer(
                services,
                userContext => { return(BlogDbContextEfFactory.CreateDbContext(Configuration)); });
            services.AddGraphQL(options => options.ExposeExceptions = true);
            services.AddSingleton <MainSchema>();
            services.AddSingleton <MainQuery>();
            services.AddSingleton <CountryGraph>();
            services.AddSingleton <AddressGraph>();
            services.AddSingleton <UserGraph>();
            services.AddSingleton <PostGraph>();

            GraphTypeTypeRegistry.Register <Country, CountryGraph>();
            GraphTypeTypeRegistry.Register <Address, AddressGraph>();
            GraphTypeTypeRegistry.Register <User, UserGraph>();
            GraphTypeTypeRegistry.Register <Post, PostGraph>();


            services.AddSingleton <IDocumentExecuter, EfDocumentExecuter>();
            services.AddSingleton <IDependencyResolver>(
                provider => new FuncDependencyResolver(provider.GetRequiredService));
            services.Configure <KestrelServerOptions>(o => { o.AllowSynchronousIO = true; });
            services.Configure <IISServerOptions>(o => { o.AllowSynchronousIO = true; });
        }
コード例 #3
0
    static IntegrationTests()
    {
        GraphTypeTypeRegistry.Register <FilterChildEntity, FilterChildGraph>();
        GraphTypeTypeRegistry.Register <FilterParentEntity, FilterParentGraph>();
        GraphTypeTypeRegistry.Register <WithManyChildrenEntity, WithManyChildrenGraph>();
        GraphTypeTypeRegistry.Register <CustomTypeEntity, CustomTypeGraph>();
        GraphTypeTypeRegistry.Register <Child1Entity, Child1Graph>();
        GraphTypeTypeRegistry.Register <ChildEntity, ChildGraph>();
        GraphTypeTypeRegistry.Register <ParentEntity, ParentGraph>();
        GraphTypeTypeRegistry.Register <Level1Entity, Level1Graph>();
        GraphTypeTypeRegistry.Register <Level2Entity, Level2Graph>();
        GraphTypeTypeRegistry.Register <Level3Entity, Level3Graph>();
        GraphTypeTypeRegistry.Register <WithMisNamedQueryParentEntity, WithMisNamedQueryParentGraph>();
        GraphTypeTypeRegistry.Register <WithNullableEntity, WithNullableGraph>();
        GraphTypeTypeRegistry.Register <NamedIdEntity, NamedIdGraph>();
        GraphTypeTypeRegistry.Register <WithMisNamedQueryChildEntity, WithMisNamedQueryChildGraph>();

        sqlInstance = new SqlInstance <IntegrationDbContext>(
            buildTemplate: async dbContext =>
        {
            await dbContext.Database.EnsureCreatedAsync();
            await dbContext.Database.ExecuteSqlRawAsync(
                @"create view ParentEntityView as
        select Property
        from ParentEntities");
        },
            constructInstance: builder => new IntegrationDbContext(builder.Options));
    }
コード例 #4
0
    public void ConfigureServices(IServiceCollection services)
    {
        GraphTypeTypeRegistry.Register <Employee, EmployeeGraph>();
        GraphTypeTypeRegistry.Register <EmployeeSummary, EmployeeSummaryGraph>();
        GraphTypeTypeRegistry.Register <Company, CompanyGraph>();

        services.AddScoped(provider => DataContextBuilder.BuildDataContext());

        EfGraphQLConventions.RegisterInContainer(services, DataContextBuilder.Model);

        foreach (var type in GetGraphQlTypes())
        {
            services.AddSingleton(type);
        }

        services.AddGraphQL(options => options.ExposeExceptions = true).AddWebSockets();
        services.AddSingleton <ContextFactory>();
        services.AddSingleton <IDocumentExecuter, EfDocumentExecuter>();
        services.AddSingleton <IDependencyResolver>(
            provider => new FuncDependencyResolver(provider.GetRequiredService));
        services.AddSingleton <ISchema, Schema>();
        var mvc = services.AddMvc();

        mvc.SetCompatibilityVersion(CompatibilityVersion.Latest);
    }
コード例 #5
0
        public static IServiceCollection RegisterTypes(this IServiceCollection services)
        {
            var enumGraphType = typeof(EnumerationGraphType <>);

            var coreAssembly         = Assembly.Load("Galaxy.Api.Core");
            var presentationAssembly = typeof(Startup).Assembly;

            //add all enums
            coreAssembly.GetEnumsForPath("Galaxy.Api.Core.Enums").ForEach(p =>
            {
                services.AddSingleton(enumGraphType.MakeGenericType(p));
                GraphTypeTypeRegistry.Register(p, enumGraphType.MakeGenericType(p));
            });

            //add all helper graph types
            presentationAssembly.GetTypesForPath("Galaxy.Api.Presentation.GraphQL.Helpers").ForEach(p =>
            {
                RuntimeHelpers.RunClassConstructor(p.TypeHandle);
                services.AddScoped(p.UnderlyingSystemType);
            });
            //add all view models
            presentationAssembly.GetTypesForPath("Galaxy.Api.Presentation.ViewModels").ForEach(p =>
            {
                services.AddScoped(p.UnderlyingSystemType);
            });

            //add all graphql queries and mutations
            presentationAssembly.GetTypesForPath("Galaxy.Api.Presentation.GraphQl.Types").ForEach(p =>
            {
                services.AddScoped(p.UnderlyingSystemType);
            });

            //add all types
            presentationAssembly.GetTypesForPath("Galaxy.Api.Presentation.GraphQl.Types.Schema").ForEach(p =>
            {
                services.AddScoped(p.GetInterfaces().First().UnderlyingSystemType, p.UnderlyingSystemType);
            });

            //add all mutations and queries
            presentationAssembly.GetTypesForPath("Galaxy.Api.Presentation.GraphQl.RootSchema").ForEach(p =>
            {
                if (!typeof(Schema).IsAssignableFrom(p))
                {
                    services.AddScoped(p.UnderlyingSystemType);
                }
            });

            var sp = services.BuildServiceProvider();

            //add schemas
            presentationAssembly.GetTypesForPath("Galaxy.Api.Presentation.GraphQl.RootSchema").ForEach(p =>
            {
                if (typeof(Schema).IsAssignableFrom(p))
                {
                    services.AddSingleton((ISchema)Activator.CreateInstance(p.UnderlyingSystemType,
                                                                            new FuncDependencyResolver(type => sp.GetService(type))));
                }
            });
            return(services);
        }
コード例 #6
0
        public void auto_register()
        {
            GraphTypeTypeRegistry.Register <Direction, EnumerationGraphType <Direction> >();
            GraphTypeTypeRegistry.Register <Money, AutoRegisteringObjectGraphType <Money> >();

            var type = new AutoRegisteringObjectGraphType <TestObject>(o => o.valuePair, o => o.someEnumerable);

            type.Fields.Count().ShouldBe(18);
            type.Fields.First(f => f.Name == nameof(TestObject.someString)).Description.ShouldBe("Super secret");
            type.Fields.First(f => f.Name == nameof(TestObject.someString)).Type.ShouldBe(typeof(StringGraphType));
            type.Fields.First(f => f.Name == nameof(TestObject.someRequiredString)).Type.ShouldBe(typeof(NonNullGraphType <StringGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someInt)).Type.ShouldBe(typeof(IntGraphType));
            type.Fields.First(f => f.Name == nameof(TestObject.someNotNullInt)).Type.ShouldBe(typeof(NonNullGraphType <IntGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someBoolean)).DeprecationReason.ShouldBe("Use someInt");
            type.Fields.First(f => f.Name == nameof(TestObject.someDate)).DefaultValue.ShouldBe(new DateTime(2019, 3, 14));
            type.Fields.First(f => f.Name == nameof(TestObject.someEnumerableOfString)).Type.ShouldBe(typeof(ListGraphType <StringGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someEnum)).Type.ShouldBe(typeof(NonNullGraphType <EnumerationGraphType <Direction> >));
            type.Fields.First(f => f.Name == nameof(TestObject.someNullableEnum)).Type.ShouldBe(typeof(EnumerationGraphType <Direction>));
            type.Fields.First(f => f.Name == nameof(TestObject.someList)).Type.ShouldBe(typeof(ListGraphType <NonNullGraphType <IntGraphType> >));
            type.Fields.First(f => f.Name == nameof(TestObject.someListWithNullable)).Type.ShouldBe(typeof(ListGraphType <IntGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someRequiredList)).Type.ShouldBe(typeof(NonNullGraphType <ListGraphType <NonNullGraphType <IntGraphType> > >));
            type.Fields.First(f => f.Name == nameof(TestObject.someRequiredListWithNullable)).Type.ShouldBe(typeof(NonNullGraphType <ListGraphType <IntGraphType> >));
            type.Fields.First(f => f.Name == nameof(TestObject.someMoney)).Type.ShouldBe(typeof(AutoRegisteringObjectGraphType <Money>));

            var enumType = new EnumerationGraphType <Direction>();

            enumType.Values["RANDOM"].DeprecationReason.ShouldBe("Do not use Random. This makes no sense!");
        }
コード例 #7
0
        public static ISchema AddStrongTypeId <TType>(this ISchema schema) where TType : IStrongTypeId
        {
            GraphTypeTypeRegistry.Register(typeof(TType), typeof(StrongTypeIdGraphType <TType>));
            schema.RegisterValueConverter(new StrongTypeIdAstValueConverter <TType>());

            return(schema);
        }
コード例 #8
0
        public void auto_register_input_object_graph_type()
        {
            GraphTypeTypeRegistry.Register <Money, AutoRegisteringInputObjectGraphType <Money> >();

            var type = new AutoRegisteringInputObjectGraphType <TestObject>(o => o.valuePair, o => o.someEnumerable);

            type.Name.ShouldBe(nameof(TestObject));
            type.Description.ShouldBe("Object for test");
            type.DeprecationReason.ShouldBe("Obsolete for test");
            type.Fields.Count.ShouldBe(18);
            type.Fields.First(f => f.Name == nameof(TestObject.someString)).Description.ShouldBe("Super secret");
            type.Fields.First(f => f.Name == nameof(TestObject.someString)).Type.ShouldBe(typeof(StringGraphType));
            type.Fields.First(f => f.Name == nameof(TestObject.someRequiredString)).Type.ShouldBe(typeof(NonNullGraphType <StringGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someInt)).Type.ShouldBe(typeof(IntGraphType));
            type.Fields.First(f => f.Name == nameof(TestObject.someNotNullInt)).Type.ShouldBe(typeof(NonNullGraphType <IntGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someBoolean)).DeprecationReason.ShouldBe("Use someInt");
            type.Fields.First(f => f.Name == nameof(TestObject.someDate)).DefaultValue.ShouldBe(new DateTime(2019, 3, 14));
            // disabled to make tests stable without touch GlobalSwitches
            //type.Fields.First(f => f.Name == nameof(TestObject.someShort)).Description.ShouldBe("Description from xml comment");
            type.Fields.First(f => f.Name == nameof(TestObject.someEnumerableOfString)).Type.ShouldBe(typeof(ListGraphType <StringGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someEnum)).Type.ShouldBe(typeof(NonNullGraphType <EnumerationGraphType <Direction> >));
            type.Fields.First(f => f.Name == nameof(TestObject.someNullableEnum)).Type.ShouldBe(typeof(EnumerationGraphType <Direction>));
            type.Fields.First(f => f.Name == nameof(TestObject.someList)).Type.ShouldBe(typeof(ListGraphType <NonNullGraphType <IntGraphType> >));
            type.Fields.First(f => f.Name == nameof(TestObject.someListWithNullable)).Type.ShouldBe(typeof(ListGraphType <IntGraphType>));
            type.Fields.First(f => f.Name == nameof(TestObject.someRequiredList)).Type.ShouldBe(typeof(NonNullGraphType <ListGraphType <NonNullGraphType <IntGraphType> > >));
            type.Fields.First(f => f.Name == nameof(TestObject.someRequiredListWithNullable)).Type.ShouldBe(typeof(NonNullGraphType <ListGraphType <IntGraphType> >));
            type.Fields.First(f => f.Name == nameof(TestObject.someMoney)).Type.ShouldBe(typeof(AutoRegisteringInputObjectGraphType <Money>));

            var enumType = new EnumerationGraphType <Direction>();

            // disabled to make tests stable without touch GlobalSwitches
            //enumType.Values["DESC"].Description.ShouldBe("Descending Order");
            enumType.Values["RANDOM"].DeprecationReason.ShouldBe("Do not use Random. This makes no sense!");
        }
コード例 #9
0
        public static void AddGraphQLConfig(this IServiceCollection services)
        {
            services.AddTransient <ShortGraphType>();
            services.AddTransient <ObjectGraphType>();
            services.AddTransient <StringSearchType>();
            services.AddTransient <StringSearchMethodEnumType>();
            services.AddTransient <NumberSearchMethodEnumType>();
            services.AddTransient <SearchOperatorEnumType>();
            services.AddTransient <SortOrderEnumType>();
            services.AddTransient <IntSearchType>();
            services.AddTransient <DateTimeSearchType>();
            services.AddTransient <FloatSearchType>();
            services.AddTransient <BooleanSearchType>();
            services.AddTransient(typeof(ScalarSearchType <>));

            services.AddGraphQL(options =>
            {
                options.EnableMetrics    = false;
                options.ExposeExceptions = true;
            })
            .AddWebSockets()
            .AddDataLoader();



            GraphTypeTypeRegistry.Register <short, ShortGraphType>();
            GraphTypeTypeRegistry.Register <DateTime, DateTimeGraphType>();
        }
コード例 #10
0
    public void ConfigureServices(IServiceCollection services)
    {
        GraphTypeTypeRegistry.Register <Employee, EmployeeGraph>();
        GraphTypeTypeRegistry.Register <EmployeeSummary, EmployeeSummaryGraph>();
        GraphTypeTypeRegistry.Register <Company, CompanyGraph>();
        services.AddScoped(_ => DbContextBuilder.BuildDbContext());
        EfGraphQLConventions.RegisterInContainer <GraphQlEfSampleDbContext>(
            services,
            model: GraphQlEfSampleDbContext.StaticModel);
        EfGraphQLConventions.RegisterConnectionTypesInContainer(services);

        foreach (var type in GetGraphQlTypes())
        {
            services.AddSingleton(type);
        }

        var graphQl = services.AddGraphQL(
            options => options.ExposeExceptions = true);

        graphQl.AddWebSockets();
        services.AddSingleton <ContextFactory>();
        services.AddSingleton <IDocumentExecuter, EfDocumentExecuter>();
        services.AddSingleton <IDependencyResolver>(
            provider => new FuncDependencyResolver(provider.GetRequiredService));
        services.AddSingleton <ISchema, Schema>();
        var mvc = services.AddMvc(option => option.EnableEndpointRouting = false);

        mvc.SetCompatibilityVersion(CompatibilityVersion.Latest);
        mvc.AddNewtonsoftJson();
    }
コード例 #11
0
        private static bool IsEnabledForRegister(Type propertyType, bool firstCall)
        {
            if (propertyType == typeof(string))
            {
                return(true);
            }

            if (propertyType.IsValueType)
            {
                return(true);                          // TODO: requires discussion: Nullable<T>, enums, any struct
            }
            if (GraphTypeTypeRegistry.Contains(propertyType))
            {
                return(true);
            }

            if (firstCall)
            {
                var realType = GetRealType(propertyType);
                if (realType != propertyType)
                {
                    return(IsEnabledForRegister(realType, false));
                }
            }

            return(false);
        }
コード例 #12
0
    public void ConfigureServices(IServiceCollection services)
    {
        GraphTypeTypeRegistry.Register <Employee, EmployeeGraph>();
        GraphTypeTypeRegistry.Register <EmployeeSummary, EmployeeSummaryGraph>();
        GraphTypeTypeRegistry.Register <Company, CompanyGraph>();
        EfGraphQLConventions.RegisterInContainer <SampleDbContext>(
            services,
            model: SampleDbContext.StaticModel);
        EfGraphQLConventions.RegisterConnectionTypesInContainer(services);

        foreach (var type in GetGraphQlTypes())
        {
            services.AddSingleton(type);
        }
        //TODO: re add for subscriptions
        //var graphQl = services.AddGraphQL(
        //    options => options.ExposeExceptions = true);
        //graphQl.AddWebSockets();

        var dbContextBuilder = new DbContextBuilder();

        services.AddSingleton <IHostedService>(dbContextBuilder);
        services.AddSingleton <Func <SampleDbContext> >(_ => dbContextBuilder.BuildDbContext);
        services.AddScoped(_ => dbContextBuilder.BuildDbContext());
        services.AddSingleton <IDocumentExecuter, EfDocumentExecuter>();
        services.AddSingleton <ISchema, Schema>();
        var mvc = services.AddMvc(option => option.EnableEndpointRouting = false);

        mvc.SetCompatibilityVersion(CompatibilityVersion.Latest);
        mvc.AddNewtonsoftJson();
    }
コード例 #13
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            // FIXME: See https://github.com/graphql-dotnet/graphql-dotnet/issues/1116
            services.Configure <KestrelServerOptions>(options =>
            {
                options.AllowSynchronousIO = true;
            });
            services.Configure <IISServerOptions>(options =>
            {
                options.AllowSynchronousIO = true;
            });

            // FIXME: See https://github.com/graphql-dotnet/graphql-dotnet/issues/1161#issuecomment-540306485
            services.AddScoped <IServiceProvider>(
                provider => new FuncServiceProvider(provider.GetRequiredService));
            services.AddScoped <ISchema, GraphQLSchema>();

            services.AddSingleton <IModelData, ModelData>();
            services.AddSingleton <QueryType>();
            services.AddSingleton <MutationType>();

            GraphTypeTypeRegistry.Register(typeof(FooInput), typeof(FooInputType));
            GraphTypeTypeRegistry.Register(typeof(Mutation), typeof(MutationType));
            GraphTypeTypeRegistry.Register(typeof(Query), typeof(QueryType));

            services.AddGraphQL(opts =>
            {
                opts.EnableMetrics    = true;
                opts.ExposeExceptions = true;
            }).AddGraphTypes(ServiceLifetime.Scoped);
        }
コード例 #14
0
        public static IServiceCollection DI_GraphQL(this IServiceCollection services)
        {
            services.AddSingleton <IDocumentExecuter, DocumentExecuter>();
            services.AddSingleton <IDocumentWriter, DocumentWriter>();

            services.AddSingleton(typeof(ISubscriptionService <>), typeof(SubscriptionService <>));

            services.AddSingleton <RootQueries>();
            services.AddSingleton <RootMutations>();
            services.AddSingleton <RootSubscription>();
            services.AddSingleton <RootSchema>();

            GraphTypeTypeRegistry.Register(typeof(MutationActionType), typeof(EnumerationGraphType <MutationAction>));

            services.AddGraphQL(options =>
            {
                options.EnableMetrics = false;
            })
            .AddErrorInfoProvider(options => options.ExposeExceptionStackTrace = true)
            .AddSystemTextJson()
            .AddUserContextBuilder(httpContext => new GraphQLUserContext {
                User = httpContext.User
            })
            .AddWebSockets()
            .AddDataLoader()
            .AddGraphTypes(typeof(RootSchema));

            return(services);
        }
コード例 #15
0
        public ForteSchema()
        {
            ValueConverter.Register <DateTime, TimeWrapper>(time => new TimeWrapper(time));
            RegisterValueConverter(new TimeWrapperAstValueConverter());
            GraphTypeTypeRegistry.Register <TimeWrapper, TimeWrapperType>();

            Query = new Query();
        }
コード例 #16
0
        public void ConfigureServices(IServiceCollection services)
        {
            ConfigureBaseServices(services);
            HostedDiscordBot.ConfigureServices(services);
            services.AddHostedService <HostedDiscordBot>();
            services.AddHostedService <ServicePreloader>();

            services.Configure <CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded    = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMemoryCache();
            services.AddResponseCaching();
            services.AddRouteAnalyzer();

            services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddXmlSerializerFormatters();

            services.AddAspAuth();

            services.AddLogging(logging => {
                //logging.AddConsole();
                logging.AddDebug();
            });

            var config = JsonConvert.DeserializeObject <Configuration>(File.ReadAllText(Configuration["BotConfigPath"]));

            services.AddSingleton(config);

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie("Cookies").AddDiscord(d => {
                d.AppId     = config.Auth.ClientId;
                d.AppSecret = config.Auth.ClientSecret;
                d.Scope.Add("identify");
                d.SaveTokens = true;
            });

            services.AddSingleton <IUserContextBuilder, GraphQLUserContextBuilder>();

            //GraphQL setup
            GraphTypeTypeRegistry.Register <TimeSpan, TimeSpanMillisecondsGraphType>();
            services.AddSingleton <InjectedSchema>();
            services.AddSingleton <InjectedSchema.IRootQuery, StatusSchema>();
            services.AddSingleton <InjectedSchema.IRootQuery, RemindersQuerySchema>();
            services.AddSingleton <InjectedSchema.IRootMutation, RemindersMutationSchema>();

            services.AddGraphQLAuth();
            services.AddGraphQL(options => {
                options.EnableMetrics           = true;
                options.ExposeExceptions        = true;
                options.ComplexityConfiguration = new ComplexityConfiguration {
                    MaxDepth = 15
                };
            });
        }
コード例 #17
0
        private static IEnumerable <PropertyInfo> GetAllPublicProperties()
        {
            var type = typeof(TSourceType);

            return((new Type[] { type })
                   .Concat(type.GetInterfaces())
                   .SelectMany(i => i.GetProperties())
                   .Where(x => GraphTypeTypeRegistry.Get(x.PropertyType) != null));
        }
コード例 #18
0
        private void RegisterCustomGraphTypes(IServiceLocator serviceLocator)
        {
            var customGraphTypes = GraphTypeLoader.GetCustomGraphTypes(serviceLocator).ToArray();

            foreach (var customGraphType in customGraphTypes)
            {
                GraphTypeTypeRegistry.Register(customGraphType.TargetType, customGraphType.GetType());
            }
        }
コード例 #19
0
    static MappingTests()
    {
        ArgumentGraphs.Initialise();
        GraphTypeTypeRegistry.Register <MappingParent, MappingParentGraph>();
        GraphTypeTypeRegistry.Register <MappingChild, MappingChildGraph>();

        sqlInstance = new SqlInstance <MappingContext>(
            constructInstance: builder => new MappingContext(builder.Options));
    }
コード例 #20
0
 static ArgumentGraphs()
 {
     GraphTypeTypeRegistry.Register(typeof(Comparison), typeof(ComparisonGraph));
     GraphTypeTypeRegistry.Register(typeof(StringComparison), typeof(StringComparisonGraph));
     Add <StringComparisonGraph>();
     Add <WhereExpressionGraph>();
     Add <OrderByGraph>();
     Add <ComparisonGraph>();
 }
コード例 #21
0
 static void Add <T>(Type type)
     where T : ScalarGraphType, new()
 {
     if (GraphTypeTypeRegistry.Get(type) == null)
     {
         GraphTypeTypeRegistry.Register(type, typeof(GuidGraph));
         var value = new T();
         entries.Add(typeof(T), value);
     }
 }
コード例 #22
0
ファイル: TypeExtensions.cs プロジェクト: ificator/graphql
        /// <summary>
        /// Gets the graph type for the indicated type.
        /// </summary>
        /// <param name="type">The type for which a graph type is desired.</param>
        /// <param name="isNullable">if set to <c>false</c> if the type explicitly non-nullable.</param>
        /// <returns>A Type object representing a GraphType that matches the indicated type.</returns>
        /// <remarks>This can handle arrays, lists and other collections implementing IEnumerable.</remarks>
        public static Type GetGraphTypeFromType(this Type type, bool isNullable = false)
        {
            while (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDataLoaderResult <>))
            {
                type = type.GetGenericArguments()[0];
            }

            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                type = type.GetGenericArguments()[0];
                if (isNullable == false)
                {
                    throw new ArgumentOutOfRangeException(nameof(isNullable),
                                                          $"Explicitly nullable type: Nullable<{type.Name}> cannot be coerced to a non nullable GraphQL type. \n");
                }
            }

            Type graphType;

            if (type.IsArray)
            {
                var clrElementType = type.GetElementType();
                var elementType    = GetGraphTypeFromType(clrElementType, clrElementType.IsNullable()); // isNullable from elementType, not from parent array
                graphType = typeof(ListGraphType <>).MakeGenericType(elementType);
            }
            else if (IsAnIEnumerable(type))
            {
                var clrElementType = GetEnumerableElementType(type);
                var elementType    = GetGraphTypeFromType(clrElementType, clrElementType.IsNullable()); // isNullable from elementType, not from parent container
                graphType = typeof(ListGraphType <>).MakeGenericType(elementType);
            }
            else
            {
                graphType = GraphTypeTypeRegistry.Get(type);
            }

            if (graphType == null)
            {
                if (type.IsEnum)
                {
                    graphType = typeof(EnumerationGraphType <>).MakeGenericType(type);
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(type), $"The type: {type.Name} cannot be coerced effectively to a GraphQL type");
                }
            }

            if (!isNullable)
            {
                graphType = typeof(NonNullGraphType <>).MakeGenericType(graphType);
            }

            return(graphType);
        }
コード例 #23
0
        public void Initialize(IServiceCollection services)
        {
            //Register .NET GraphQL server
            var graphQlBuilder = services.AddGraphQL(_ =>
            {
                _.EnableMetrics = false;
            }).AddNewtonsoftJson(deserializerSettings => { }, serializerSettings => { })
                                 .AddErrorInfoProvider(options =>
            {
                options.ExposeExtensions          = true;
                options.ExposeExceptionStackTrace = true;
            })
                                 .AddUserContextBuilder(context => context.BuildGraphQLUserContext())
                                 .AddRelayGraphTypes()
                                 .AddDataLoader()
                                 .AddGraphTypes(typeof(XCoreAnchor));

            //Register custom GraphQL dependencies
            services.AddPermissionAuthorization();

            services.AddSingleton <ISchema, SchemaFactory>();

            //Register all xApi boundaries
            services.AddXCatalog(graphQlBuilder);
            services.AddXProfile(graphQlBuilder);
            services.AddXPurchase(graphQlBuilder);
            services.AddXOrder(graphQlBuilder);

            //TODO: Remove after update GraphQL.net to 3.2.0 version.
            //VP-6356 DateTime field types for GraphQL schema do not return time in result
            GraphTypeTypeRegistry.Register <DateTime, DateTimeGraphType>();


            services.AddSingleton <IStoreCurrencyResolver, StoreCurrencyResolver>();

            services.AddAutoMapper(ModuleInfo.Assembly);

            #region Pipelines
            services.AddPipeline <PromotionEvaluationContext>(builder =>
            {
                builder.AddMiddleware(typeof(LoadUserToEvalContextMiddleware));
                builder.AddMiddleware(typeof(LoadCartToEvalContextMiddleware));
            });
            services.AddPipeline <TaxEvaluationContext>(builder =>
            {
                builder.AddMiddleware(typeof(LoadUserToEvalContextMiddleware));
                builder.AddMiddleware(typeof(LoadCartToEvalContextMiddleware));
            });
            services.AddPipeline <PriceEvaluationContext>(builder =>
            {
                builder.AddMiddleware(typeof(LoadUserToEvalContextMiddleware));
                builder.AddMiddleware(typeof(LoadCartToEvalContextMiddleware));
            });
            #endregion
        }
コード例 #24
0
    public static Type FindGraphType <TReturn>()
        where TReturn : class
    {
        var graphType = GraphTypeTypeRegistry.Get <TReturn>();

        if (graphType != null)
        {
            return(graphType);
        }
        throw new Exception($"Could not resolve a GraphType for {typeof(TReturn).FullName}. Either pass in a GraphType explicitly or register a GraphType using GraphTypeTypeRegistry.Register<{typeof(TReturn).FullName},MyGraphType>().");
    }
コード例 #25
0
        public static void InjectGraphQl(this IServiceCollection collection)
        {
            InjectForNamespace(collection, "HouseHub.Web.UserApi.Presentation.GraphQl.Schemas");
            InjectForNamespace(collection, "HouseHub.Web.UserApi.Presentation.GraphQl.Queries");
            InjectForNamespace(collection, "HouseHub.Web.UserApi.Presentation.GraphQl.Mutations");

            collection.AddScoped <IDependencyResolver>(s => new FuncDependencyResolver(s.GetRequiredService));
            collection.AddScoped <RootSchema>();
            collection.AddScoped <RootMutation>();
            collection.AddScoped <RootQuery>();
            collection.AddScoped <ISchema, RootSchema>();
            collection.AddScoped <GuidGraphType>();
            collection.AddScoped <UriGraphType>();
            collection.AddScoped <EnumerationGraphType <OrderDirection> >();

            var coreAssembly = Assembly.Load("HouseHub.Web.UserApi.Core");

            coreAssembly.GetTypesForPath("HouseHub.Web.UserApi.Core.GraphQl.Helpers").ForEach(p =>
            {
                RuntimeHelpers.RunClassConstructor(p.TypeHandle);
                collection.AddScoped(p.UnderlyingSystemType);
            });

            coreAssembly.GetTypesForPath("HouseHub.Web.UserApi.Core.GraphQl.InputObjects").ForEach(p => { collection.AddScoped(p.UnderlyingSystemType); });

            coreAssembly.GetTypesForPath("HouseHub.Web.UserApi.Core.GraphQl.OutputObjects").ForEach(p => { collection.AddScoped(p.UnderlyingSystemType); });

            var enumGraphType = typeof(EnumerationGraphType <>);

            coreAssembly.GetEnumsForPath("HouseHub.Web.UserApi.Core.Enums").ForEach(p =>
            {
                collection.AddSingleton(enumGraphType.MakeGenericType(p));
                GraphTypeTypeRegistry.Register(p, enumGraphType.MakeGenericType(p));
                collection.AddScoped(enumGraphType.MakeGenericType(p));
            });

            GraphTypeTypeRegistry.Register(typeof(OrderDirection), enumGraphType.MakeGenericType(typeof(OrderDirection)));
            GraphTypeTypeRegistry.Register(typeof(Guid), typeof(GuidGraphType));

            collection.AddGraphQL(opt => { opt.ExposeExceptions = true; })
            .AddGraphTypes(ServiceLifetime.Scoped)
            .AddDataLoader();


            ValueConverter.Register(
                typeof(double),
                typeof(float),
                value => Convert.ToSingle(value, NumberFormatInfo.InvariantInfo));

            ValueConverter.Register(
                typeof(float),
                typeof(double),
                value => Convert.ToDouble(value, NumberFormatInfo.InvariantInfo));
        }
コード例 #26
0
        /// <summary>
        /// Resolve the GraphType for a Type, first looking for any attributes
        /// then falling back to the default library implementation.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private static Type GetGraphTypeInternal(Type type)
        {
            // Support enum types
            if (type.GetTypeInfo().IsEnum)
            {
                return(typeof(EnumerationGraphType <>).MakeGenericType(type));
            }

            var graphqlType = GraphTypeTypeRegistry.Get(type);

            return(graphqlType ?? typeof(InputObjectGraphType <>).MakeGenericType(type));
        }
コード例 #27
0
        protected virtual bool IsEnabledForRegister(PropertyInfo propertyInfo, Type propertyType, bool firstCall)
        {
            if (propertyInfo.GetCustomAttribute <IgnoreAttribute>() != null)
            {
                return(false);
            }

            if (propertyType == typeof(string))
            {
                return(true);
            }

            if (propertyType.IsValueType)
            {
                return(true);                          // TODO: requires discussion: Nullable<T>, enums, any struct
            }
            if (GraphTypeTypeRegistry.Contains(propertyType))
            {
                return(true);
            }

            if (propertyType == typeof(ResolveFieldContext))
            {
                return(false);
            }

            if (firstCall)
            {
                var realType = GetRealType(propertyType);
                if (realType != propertyType)
                {
                    return(IsEnabledForRegister(propertyInfo, realType, false));
                }
            }

            var fieldConfiguration = _typeConfiguration.GetFieldConfiguration(propertyInfo.Name);

            if (fieldConfiguration?.Ignored == true || fieldConfiguration?.Output == false)
            {
                return(false);
            }

            if (!propertyType.IsValueType && propertyType.IsClass)
            {
                var type = typeof(AutoObjectGraphType <>).MakeGenericType(propertyType);
                GraphTypeTypeRegistry.Register(propertyType, type);

                return(true);
            }

            return(false);
        }
コード例 #28
0
        public static IGraphQLBuilder AddEntityGraphQuery(this IGraphQLBuilder builder)
        {
            GraphTypeTypeRegistry.Register <DateTime, DateTimeGraphType>(); //fix DateTime GraphType mapping
            builder.Services.TryAddSingleton <IEntityGraphTypeBuilder, EntityGraphTypeBuilder>();

            builder.AddEntityGraphQueryTypes();

            builder.AddEntityGraphQueryArguments();

            builder.AddEntityGraphQueryResolver();

            return(builder);
        }
コード例 #29
0
        /// <summary>
        /// Add Graphity with a user defined configuration
        /// </summary>
        /// <typeparam name="TContext"></typeparam>
        /// <param name="services"></param>
        /// <param name="setupAction">Use this to configure the graph.</param>
        /// <returns></returns>
        public static IServiceCollection AddGraphity <TContext>(
            this IServiceCollection services,
            Action <IQueryOptions <TContext> > setupAction)
            where TContext : DbContext
        {
            var contextService = services.SingleOrDefault(sd => sd.ImplementationType == typeof(TContext));

            if (contextService == null)
            {
                throw new GraphityException("Unable to configure Graphity when the context service hasn't been registered");
            }

            var queryOptions = new QueryOptions <TContext>();

            setupAction?.Invoke(queryOptions);
            DynamicQuery <TContext> .QueryOptions = queryOptions;

            services.AddSingleton <IDocumentExecuter, DocumentExecuter>();
            services.AddSingleton <IScopedDependencyResolver>(serviceProvider => new ScopedFuncDependencyResolver(serviceProvider.GetRequiredService, serviceProvider.CreateScope));
            services.AddSingleton <ISchema, DynamicSchema <TContext> >();
            services.AddSingleton <DynamicQuery <TContext> >();
            services.AddSingleton <ObjectGraphType>();
            services.AddSingleton <GuidGraphType>();

            //Where
            services.AddSingleton <WhereExpressionType>();
            services.AddSingleton <ComparisonType>();
            GraphTypeTypeRegistry.Register <Comparison, ComparisonType>();
            GraphTypeTypeRegistry.Register <WhereExpression, WhereExpressionType>();

            //Ordering
            services.AddSingleton <OrderByExpressionType>();
            services.AddSingleton <OrderByDirectionType>();
            GraphTypeTypeRegistry.Register <OrderByDirection, OrderByDirectionType>();
            GraphTypeTypeRegistry.Register <OrderByExpression, OrderByExpressionType>();

            foreach (var field in queryOptions.GetAllFields())
            {
                var graphType = typeof(DynamicObjectGraphType <,>).MakeGenericType(typeof(TContext), field.Type);

                services.AddSingleton(
                    graphType,
                    Activator.CreateInstance(graphType, field, (Action <Type>)TypeRegistrar));
            }

            AddGraphQLAuth(services, queryOptions.AuthorisationPolicies);

            void TypeRegistrar(Type type) => services.AddSingleton(type);

            return(services);
        }
コード例 #30
0
        public static Type GetGraphTypeFromTypeOrNull(this Type type, bool isNullable = false)
        {
            TypeInfo info = type.GetTypeInfo();

            if (info.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                type = type.GetGenericArguments()[0];
                if (isNullable == false)
                {
                    throw new ArgumentOutOfRangeException(nameof(isNullable),
                                                          $"Explicitly nullable type: Nullable<{type.Name}> cannot be coerced to a non nullable GraphQL type. \n");
                }
            }

            var graphType = GraphTypeTypeRegistry.Get(type);

            if (type.IsArray)
            {
                var elementType = GetGraphTypeFromTypeOrNull(type.GetElementType(), isNullable);
                if (elementType != null)
                {
                    var listType = typeof(ListGraphType <>);
                    graphType = listType.MakeGenericType(elementType);
                }
            }

            if (IsAnIEnumerable(type))
            {
                var elementType = GetGraphTypeFromTypeOrNull(type.GenericTypeArguments.First(), isNullable);
                if (elementType != null)
                {
                    var listType = typeof(ListGraphType <>);
                    graphType = listType.MakeGenericType(elementType);
                }
            }

            if (graphType == null)
            {
                return(null);
            }

            if (!isNullable)
            {
                var nullType = typeof(NonNullGraphType <>);
                graphType = nullType.MakeGenericType(graphType);
            }

            return(graphType);
        }