【问题标题】:Defining FieldNameConverter inside GraphQL.Types.Schema is not working in asp.net core在 GraphQL.Types.Schema 中定义 FieldNameConverter 在 asp.net 核心中不起作用
【发布时间】:2021-04-15 01:37:42
【问题描述】:

我正在将 graphql-dotnetgraphql-dotnet 服务器 与 asp.net 核心一起使用。我已经通过以下方式配置了架构。

public class PdsGraphQlSchema: Schema
{
    public PdsGraphQlSchema()
    {
        FieldNameConverter = new PascalCaseFieldNameConverter();
        Query = CommonServiceLocator.ServiceLocator.Current.GetInstance<GraphQlQueries>();
        Mutation = CommonServiceLocator.ServiceLocator.Current.GetInstance<GraphQlMutations>();
    }
}

这里我加了FieldNameConverter = new PascalCaseFieldNameConverter();但我没有得到输出的变化。输出总是驼峰式。我如何可以忽略骆驼套管或使用 Pascale 套管。

对于 ConfigureServices,我使用了以下

services.AddGraphQL(_ =>
            {
                _.EnableMetrics = true;
                _.ExposeExceptions = true;
            });

services.AddSingleton();

Configure里面我用过以下

app.UseGraphQL<PdsGraphQlSchema>();
app.UseGraphQLPlayground(new GraphQLPlaygroundOptions
{   Path = "/ui/playground" });

期待您的帮助。

【问题讨论】:

    标签: asp.net-core graphql-dotnet


    【解决方案1】:

    这个问题是由于DefaultGraphQLExecuter没有在GetOptions中设置FieldNameConverter造成的。

    尝试以下解决方案:

    • 自定义DefaultGraphQLExecuter

      public class MyDefaultGraphQLExecuter<TSchema> : DefaultGraphQLExecuter<TSchema>
           where TSchema : ISchema
      {
      
          public MyDefaultGraphQLExecuter(TSchema schema, IDocumentExecuter documentExecuter, IOptions<GraphQLOptions> options, IEnumerable<IDocumentExecutionListener> listeners, IEnumerable<IValidationRule> validationRules) 
              : base(schema, documentExecuter, options, listeners, validationRules)
          {
          }
      
          protected override ExecutionOptions GetOptions(string operationName, string query, Inputs variables, object context, CancellationToken cancellationToken)
          {
              var options = base.GetOptions(operationName, query, variables, context, cancellationToken);
              options.FieldNameConverter = Schema.FieldNameConverter;
              return options;
          } 
      }
      
    • 替换内置DefaultGraphQLExecuter

                  services.AddGraphQL(options =>
              {
                  options.EnableMetrics = true;
                  options.ExposeExceptions = Environment.IsDevelopment();                
                  //options.
              })
              .AddWebSockets()
              .AddDataLoader();
      
              services.AddMvc();
      
              services.AddTransient(typeof(IGraphQLExecuter<>), typeof(MyDefaultGraphQLExecuter<>));
      

    【讨论】:

      【解决方案2】:

      您必须使用架构中的 NameConverter 字段

      public class AppSchema : Schema
      {
          public AppSchema(IServiceProvider provider)
              : base(provider)
          {
              NameConverter = new GraphQL.Conversion.DefaultNameConverter();
              Query = new AppQuery();
              Mutation = new AppMutation();
          }
      }
      

      你有 3 个选项

      1- DefaultFieldNameConverter() 没有变化,你看到你在输出中写了什么

      2- PascalCaseFieldNameConverter() 将所有第一个字符转为小写

      3- CamelCaseFieldNameConverter() 将所有 First Charecter 转为小写

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 2018-08-02
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        相关资源
        最近更新 更多