Problem mit dem Abruf von Entität durch ID bei Verwendung des Relay -AnsatzesC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Problem mit dem Abruf von Entität durch ID bei Verwendung des Relay -Ansatzes

Post by Anonymous »

Ich habe ein Problem mit der Abnahme von Entität durch ID bei Verwendung des Relay -Ansatzes. < /p>
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 
(Parseliteral -Methode von InputParser). Im Fall von SimpleQuery gibt es für das Feld ID eine IDFormatter vorhanden (Formatmethode des Formaters). Dies führt dann zu einem Anruf der Parse -Methode von optimizedNodeSerializer (Parse -Methode des optimiertenNodeIdSerializer). Bei dieser Methode wird Valuerializer nicht initialisiert, da ident von GuidnodeIdValueSerializer mit idType als Parameter aufgerufen wird und false zurückgibt. Dies führt dazu, dass Serializermissing eine Ausnahme ausgelöst wird. REENSUVORTED Gibt false zurück, da der Eingabeparameter Typ IDType , nicht GUID (ISSUVORTED METHODE DER GUIDNODEIDVALUESEERIALIZER). von RelayQuery ist für IDField in der Parselitereral -Methode von InputParser kein Formatier vorhanden (Parseliteral -Methode von InputParser im Fall von RelayQuery). Aus diesem Grund wird das Format nicht aufgerufen und formatValue die Wertvariable (FormatValue -Methode) zurückgibt. Deshalb funktioniert alles gut. Könnten Sie mir bitte helfen zu verstehen, was mir fehlt? Hier ist, wie mein Programm.cs aussieht: < /p>
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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post