示例#1
0
        /// <summary>
        /// Initializes the schema:
        /// * Add any controllers to the schema instance that were configured during startup.
        /// * add all methods, virtual graph types, return types parameters and property configuration.
        /// * Add any additional types added at startup.
        /// * Register introspection meta-fields.
        /// * Compile and instantiate the resolution pipeline.
        /// </summary>
        /// <param name="schema">The schema to initialize.</param>
        public virtual void Initialize(ISchema schema)
        {
            Validation.ThrowIfNull(schema, nameof(schema));
            if (schema.IsInitialized)
            {
                return;
            }

            lock (schema)
            {
                if (schema.IsInitialized)
                {
                    return;
                }

                schema.Configuration.Merge(_options.CreateConfiguration());

                var manager = new GraphSchemaManager(schema);
                manager.AddIntrospectionFields();
                manager.AddBuiltInDirectives();

                // add any configured types to this instance
                foreach (var type in _options.RegisteredSchemaTypes)
                {
                    var typeDeclaration = type.SingleAttributeOrDefault <GraphTypeAttribute>();
                    if (typeDeclaration != null && typeDeclaration.PreventAutoInclusion)
                    {
                        continue;
                    }

                    manager.EnsureGraphType(type);
                }

                manager.BuildIntrospectionData();
                schema.IsInitialized = true;
            }
        }