Когда я отправляю этот запрос: < /p>
Код: Выделить всё
query simpleQuery {
getSchemaInfo(Id: "U2NoZW1hSW5mbzq0cC2Zq7keTLzUWk7aem8Y") {
name
}
}
< /code>
Я получаю эту ошибку: < /p>
Нет сериализатора, зарегистрированного для типа Schemainfo < /p>
< /blockquote>
Однако, когда я отправляю запрос на ретрансляцию: < /p>
.query relayQuery {
node(id: "U2NoZW1hSW5mbzq0cC2Zq7keTLzUWk7aem8Y") {
... on SchemaInfo {
name
}
}
}
Я исследовал хот -шоколат во время выполнения и обнаружил только одно отличие. В случае SimpleQuery есть идентификатор для поля ID (идентификатор, присутствующий для поля идентификатора в методе Parseliteral), который приводит к методу формата вызываемого этого форматера (метод формата форматета). Затем это приводит к вызову метода Parse оптимизированного нодериализатора (метод Parse OptimizedNodeidSerializer). В этом методе ValuesErializer не инициализируется, поскольку eSsupported guidnodeidvalueserializer с idtype , когда параметр вызывается и возвращает false . Это приводит к тому, что Serializermissing выбросит исключение. Issupported возвращает false , потому что входной параметр имеет тип idtype , а не GUID (метод GuidnodeIdValueSerializer). InpintParser в случае реле). Из -за этого метод формата не вызывается, и FormatValue возвращает переменную значение (метод FormatValue). Вот почему все работает нормально. Не могли бы вы помочь мне понять, что мне не хватает? Вот как моя программа.
Код: Выделить всё
private static void AddSchemaTypes(IRequestExecutorBuilder builder)
{
// get entities from assembly
typeof(Entity).Assembly.GetTypes()
.Where(t => t.IsSubclassOf(typeof(Entity)))
.ForEach(t => builder
// add type that will be returned from query
.AddType(typeof(EntityType).MakeGenericType(t))
// add query for this entity
.AddTypeExtension(typeof(QueryType).MakeGenericType(t)));
builder.
ConfigureSchema(b => b.AddRootType(
new ObjectType(d => d.Name(OperationTypeNames.Query)),
OperationType.Query));
}
private static void Main(string[] args)
{
ConfigurationProvider.ConnectionStrings.MustNotBeNull();
DatabaseInitializer.Initialize(ConfigurationProvider.ConnectionStrings.PostgresConnectionString);
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpContextAccessor();
builder.Services.AddSingleton(new TransactionScopeHandler(new(ConfigurationProvider.ConnectionStrings.PostgresConnectionString)));
builder.Services.AddGraphQLServer()
.AddTransactionScopeHandler(s => s.GetService().MustNotBeNull())
.AddFiltering()
.AddSorting()
.AddProjections()
.ModifyPagingOptions(opt => opt.IncludeTotalCount = true)
.AddGlobalObjectIdentification()
.AddInMemorySubscriptions();
AddSchemaTypes(builder.Services.AddGraphQL());
var app = builder.Build();
app.UseHttpsRedirection();
app.UseWebSockets();
app.MapGraphQL();
app.RunWithGraphQLCommands(args);
}
Код: Выделить всё
internal class EntityType : ObjectType
where T : Entity, new()
{
protected override void Configure(IObjectTypeDescriptor descriptor)
{
descriptor.MustNotBeNull();
descriptor
.Description("description");
descriptor
.ImplementsNode()
.IdField(f => f.Id)
.ResolveNode(Query.GetAsync);
typeof(T).GetProperties().ForEach(property =>
{
var prop = descriptor
.Field(property)
.Description(info.Name);
if (property.Name is nameof(Entity.Id))
{
prop.ID();
}
});
}
}
< /code>
Вот как выглядит QueryType: < /p>
internal class QueryType : ObjectTypeExtension
where T : Entity, new()
{
protected override void Configure(IObjectTypeDescriptor descriptor)
{
descriptor.Name(OperationTypeNames.Query);
descriptor
.Field($"get{typeof(T).Name}")
.Description("some description")
.Type()
.Resolve(async context => await Query.GetAsync(context, default!))
.Argument(nameof(Entity.Id), a => a
.Description("some description")
.Type()
.ID());
descriptor
.Field($"get{typeof(T).Name}Collection")
.Description("some description")
.Type()
.Resolve(Query.Get)
.UseOffsetPaging()
.UseProjection()
.UseFiltering()
.UseSorting();
}
}
public abstract class Entity
{
public Guid Id { get; set; }
public DateTime? Timestamp { get; set; }
}
< /code>
Я попытался изменить общий аргумент в типе метод запроса от idtype на Stringtype, тип Uuid, но idtype все еще передается в метод Parseliteral. Я ожидаю, что оба запроса вернут значение без ошибок
Подробнее здесь: https://stackoverflow.com/questions/794 ... y-approach