Search code examples
graphqlhotchocolate

ScopedContextData VS LocalContextData VS ContextData in Hot Chocolate


What are the differences between ScopedContextData, LocalContextData, and ContextData, in Hot Chocolate?


Solution

  • ContextData:

    This is the global context data. This data is accessible for all resolvers in this request.

    You can set it with:

     services.AddGraphQLServer()
        .SetContextData("foo", "bar");
    

    if you need access to the HTTP Context:

     services.AddGraphQLServer()
        .AddHttpRequestInterceptor<CustomInterceptor>()
    
        public class CustomInterceptor : DefaultHttpRequestInterceptor
        {
            public override ValueTask OnCreateAsync(
                HttpContext context,
                IRequestExecutor requestExecutor,
                IQueryRequestBuilder requestBuilder,
                CancellationToken cancellationToken)
            {
                requestBuilder.AddProperty("foo", "bar");
                return base.OnCreateAsync(context, requestExecutor, requestBuilder, cancellationToken);
            }
        }
    

    ScopedContextData:

    Is available for the whole subtree of this resolver This is a immutable that can be modified in resolvers or middlewares via the context:

    context.ScopedContextData = context.ScopedContextData.SetItem("foo","bar");
    

    LocalContextData:

    Is only available inside the resolver pipeline. This can be used to communicate between middlewares.This is a immutable that can be modified in resolvers or middlewares via the context:

    context.LocalContextData = context.LocalContextData.SetItem("foo","bar");