/// <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); }