Wenn ich diese Anfrage sende:
Code: Select all
query simpleQuery {
getSchemaInfo(Id: "U2NoZW1hSW5mbzq0cC2Zq7keTLzUWk7aem8Y") {
name
}
}
< /code>
Ich erhalte den folgenden Fehler: Kein Serializer für Typ Schemainfo < /p>
Wenn ich jedoch eine Relay -Anforderung sende: < /p>
query relayQuery {
node(id: "U2NoZW1hSW5mbzq0cC2Zq7keTLzUWk7aem8Y") {
... on SchemaInfo {
name
}
}
}
< /code>
Alles funktioniert gut < /p>
Ich habe Hotchocolat während der Ausführung untersucht und nur einen Unterschied gefunden:
schauen wir uns die Parselitereral < /code> -Methode an von InputParser
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);
}
< /code>
Hier ist, wie entityType aussieht:
i < /p>
nternal 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>
Hier ist, wie QueryType aussieht: < /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();
}
}
< /code>
So sieht die Entität < /p>
auspublic abstract class Entity
{
public Guid Id { get; set; }
public DateTime? Timestamp { get; set; }
}
< /code>
Ich habe versucht, das generische Argument in der Typ -Methode von queryType von idType in StringType, UUID -Typ, zu ändern Fehler