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