C# 带有GraphQL数据加载器的空上下文
在使用的项目中,我意外地开始出现错误,称DataLoader上下文为null: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
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>();
}