Есть ли способ игнорировать все поля по умолчанию для типа GraphQL и добавлять только нужное поле?

#asp.net #.net #graphql #hotchocolate

#asp.net #.net #graphql #горячий шоколад

Вопрос:

Есть ли способ игнорировать все поля по умолчанию для типа GraphQL и добавлять только нужное поле?

Hot Chocolate автоматически выводит члены типа GraphQL из типа C #.

Это означает , что следующий код …

 public class Foo
{
    public string Bar { get; set; }

    public string? Baz { get; set; }
}
 
 public class FooType : ObjectType<Foo>
{
}
 

приведет к следующему типу GraphQL:

 type Foo {
  bar: String!
  baz: String
}
 

В моем варианте использования я хочу изменить это поведение и явно определить, какой тип элемента моего типа C # используется в типе GraphQL.

Ответ №1:

Горячий шоколад позволяет изменить поведение для каждого типа или для всей схемы.

Чтобы объявить все поля для одного определенного типа, явно выполните следующие действия:

 public class FooType : ObjectType<Foo>
{
    protected override void Configure(IObjectTypeDescriptor<Person> descriptor)
    {
         // this defines that fields shall only be defined explicitly
         descriptor.BindFieldsExplicitly();

         // now declare the fields that you want to define.
         descriptor.Field(t => t.Bar);    
    }
}
 
 type Foo {
  bar: String!
}
 

Если вы хотите явно объявлять поля для всех типов в вашей схеме, вы можете установить следующую опцию:

 services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    // this option will, by default, define that you want to declare everything explicitly.
    .ModifyOptions(c => c.DefaultBindingBehavior = BindingBehavior.Explicit);
 

Если вы установите его глобально, вы можете переопределить его всегда для каждого типа, что означает, что в этом случае вы можете определить неявную привязку членов по типу.

Комментарии:

1. Есть ли способ по умолчанию использовать явное поведение привязки только для фильтрации и сортировки? что-то вроде .AddFiltering(c => c.DefaultBindingBehavior = BindingBehavior.Explicit)

2. Для полноты картины существует также обратный вариант (который используется по умолчанию): descriptor.Field(...).Ignore()

3. Крошечное замечание, я думаю, что схема ответа неверна. «baz» не должно быть там, поскольку оно явно не определено. Это немного сбивает с толку, когда вы читаете это 😉

4. верно 🙂 Я исправил свой ответ.