Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有GraphQL数据加载器的空上下文_C#_Asp.net Core_Graphql Dotnet - Fatal编程技术网

C# 带有GraphQL数据加载器的空上下文

C# 带有GraphQL数据加载器的空上下文,c#,asp.net-core,graphql-dotnet,C#,Asp.net Core,Graphql Dotnet,在使用的项目中,我意外地开始出现错误,称DataLoader上下文为null: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] An unhandled exception has occurred while executing the request. System.ArgumentNullException: Value cannot be null. Parameter name: context at G

在使用的项目中,我意外地开始出现错误,称DataLoader上下文为null:

Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.ArgumentNullException: Value cannot be null.
Parameter name: context
  at GraphQL.DataLoader.DataLoaderContextExtensions.GetOrAddBatchLoader[TKey,T](DataLoaderContext context, String loaderKey, Func`3 fetchFunc, IEqualityComparer`1 keyComparer, T defaultValue)

context
参数来自注入图形类型构造函数的
IDataLoaderContextAccessor
。为什么会为空?

如果在执行查询之前忘记添加
DataLoaderDocumentListener
,则
上下文
参数将为空(就像我所做的那样):


准确但模糊的错误消息让我困惑,直到我记得我“重构”了一些代码并删除了
侦听器。错误地添加了
行。

您还需要确保
services.AddMvc()

在startup.ConfigureServices()的所有其他内容之前,整个graphql dotnet项目都是反模式的。我不希望它在目前的开发阶段真的能很好地工作。@ĴošWilliard嗯,这很奇怪,因为我知道很多人在生产中使用它,它确实工作得很好。这是一个可怕的想法。整个项目急需重构。@ošoħWilliard为什么?这是一个相当成熟的产品,整个项目充满了代码味道和反模式。首先想到的是它对服务定位器反模式的依赖。
ConfigureServices
中调用的顺序并不重要。在
Configure
中,这很重要,因为这是在设置响应管道。@NateBarbettini这是我为了填充上下文而更改的内容,因为在更改之前它是空的。。所以我不确定,嗯,这很奇怪。您确定它是
ConfigureServices
?简单地更改
AddMvc
的位置会导致差异吗?我对它的理解可能是错误的。不确定,因为我可能改变了另一件我认为不相关的小事。不过,我知道ConfigureServices中的事情顺序会有所不同
public GraphQLController(
    ISchema schema,
    IDocumentExecuter documentExecuter,
    DataLoaderDocumentListener dataLoaderListener)
{
    _schema = schema;
    _documentExecuter = documentExecuter;
    _dataLoaderListener = dataLoaderListener;
}

[HttpPost]
public async Task<IActionResult> Post([FromBody]BaseGraphQuery query)
{
    var inputs = query.Variables.ToInputs();
    var executionOptions = new ExecutionOptions
    {
        Schema = _schema,
        Query = query.Query,
        Inputs = inputs,
    };

    // Important!
    executionOptions.Listeners.Add(_dataLoaderListener);

    // (Execute the query)
}
public void ConfigureServices(IServiceCollection services)
{
    // (other service configuration)

    services.AddSingleton<GraphQL.DataLoader.IDataLoaderContextAccessor, GraphQL.DataLoader.DataLoaderContextAccessor>();
    services.AddSingleton<GraphQL.DataLoader.DataLoaderDocumentListener>();
    services.AddSingleton<GraphQL.IDocumentExecuter, GraphQL.DocumentExecuter>();
    services.AddSingleton<GraphQL.Types.ISchema, RootSchema>();
}