Ejemplo n.º 1
0
        public static IGraphQLBuilder AddSelfActivatingSchema <TSchema>(this IGraphQLBuilder builder, ServiceLifetime serviceLifetime = ServiceLifetime.Singleton)
            where TSchema : class, ISchema
        {
            if (serviceLifetime == ServiceLifetime.Transient && typeof(IDisposable).IsAssignableFrom(typeof(TSchema)))
            {
                // This scenario can cause a memory leak if the schema is requested from the root service provider.
                // If it was requested from a scoped provider, then there is no reason to register it as transient.
                // See following link:
                // https://docs.microsoft.com/en-us/dotnet/core/extensions/dependency-injection-guidelines#disposable-transient-services-captured-by-container
                throw new InvalidOperationException("A schema that implements IDisposable should not be registered as a transient service. " +
                                                    "See https://docs.microsoft.com/en-us/dotnet/core/extensions/dependency-injection-guidelines#disposable-transient-services-captured-by-container");
            }

            // Register the service with the DI provider as TSchema, overwriting any existing registration
            builder.Register(provider =>
            {
                var selfActivatingServices = new SelfActivatingServiceProvider(provider);
                var schema = ActivatorUtilities.CreateInstance <TSchema>(selfActivatingServices);
                return(schema);
            }, serviceLifetime);

            // Now register the service as ISchema if not already registered.
            builder.TryRegister <ISchema>(provider =>
            {
                var selfActivatingServices = new SelfActivatingServiceProvider(provider);
                var schema = ActivatorUtilities.CreateInstance <TSchema>(selfActivatingServices);
                return(schema);
            }, serviceLifetime);

            return(builder);
        }
 public static IGraphQLBuilder AddDataLoader(this IGraphQLBuilder builder)
 {
     builder.AddDocumentListener <DataLoaderDocumentListener>();
     builder.Register <IDataLoaderContextAccessor, DataLoaderContextAccessor>(ServiceLifetime.Singleton);
     return(builder);
 }