asp.net core - Organización de consultas con HotChocolate

CorePress2024-01-25  185

Estoy intentando organizar mi consulta de esa manera

public class RootQueryType : ObjectType
    {
        protected override void Configure(IObjectTypeDescriptor descriptor)
        {
            descriptor.Include<UserQuery>().Name("userQuery");

            descriptor.Include<MessageQuery>().Name("messageQuery");
        }
    }

Pero en mi patio de juegos de Altair termino con esto:

No hay userQuery, pero aún puedo consultar campos desde allí. Creo que no es la forma en que debería funcionar Include y estoy buscando una manera de separar messageQuery y userQuery.



------------------------------------

Incluir fusiona todos los campos del tipo incluido en el tipo actual. Nombre se refiere al nombre del tipo actual. Para obtener otro nivel en su tipo, simplemente cree un campo que devuelva el nuevo tipo.

¿Sabías que no necesitas estos descriptores de tipo, sino que simplemente puedes expresartodo con C# puro.

public class Query 
{
    public UserQuery GetUsers() => new UserQuery();
}

public class UserQuery 
{
    ...
}

Esto dará como resultado:

type Query {
  users: UserQuery
}

type UserQuery {
  # ...
}



------------------------------------

Incluir devuelve el IObjectTypeDescriptor Entonces, lo que estás haciendo es configurar el nombre de RootQueryType

Si te entiendo correctamente, te gustaría poder realizar consultas así:

{
    userQuery {
      userName
    }
    messageQuery {
      message
    }
}
public class RootQueryType : ObjectType
    {
        protected override void Configure(IObjectTypeDescriptor descriptor)
        {
            descriptor.Field("userQuery").Resolve(new UserQuery())
            descriptor.Field("messageQuery").Resolve(new MessageQuery())
        }
    }

En caso de que desee combinar los tipos y poder crear una consulta como esta:

  
{ 
    userName  
    message 
}

Puedes utilizar extensiones de tipo de objeto

[ExtendObjectType("Query")]
public class UserQuery {
    public string GetUserName() => ...
  
}
[ExtendObjectType("Query")]
public class MessageQuery {
    public string Message() => ...
  
}

Entonces puedes hacer

services.AddGraphQLServer()
   .AddQueryType(x => x.Name("Query"))
   .AddTypeExtension<UserQuery>()
   .AddTypeExtension<MessageQuery>()
   

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare