Я работаю над ASP.NET Web API и добавил поддержку запросов GraphQL с GraphQL для .NET .Мои запросы работают, как и ожидалось, но сейчас я пытаюсь использовать ту же логику с мутациями.
У меня есть следующая логика для моих запросов:
Field<ContactType>("contact", "This field returns the contact by Id",
arguments: new QueryArguments(QA_ContactId),
resolve: ctx => ContactResolvers.ContactDetails(ctx));
Мой преобразователь возвращает ContactDomainEntity , который затем преобразуется в ContactType :
public class ContactType : ObjectGraphType<ContactDomainEntity>
{
public ContactType()
{
Name = "Contact";
Description = "Contact Type";
Field(c => c.Id);
Field(c => c.FirstName, nullable: true);
Field<ListGraphType<AddressType>, IEnumerable<AddressDTO>>(Field_Addresses)
.Description("Contact's addresses")
.Resolve(ctx => LocationResolvers.ResolveAddresses(ctx));
}
}
Все это работает очень хорошо, и список адресов разрешается с помощью собственного reslver (LocationResolvers.ResolveAddresses), который делаетон может использоваться повторно и помогает разделить проблемы.
Теперь я хочу иметь возможность редактировать контакт и надеялся использовать ту же логику, в которой дочерние объекты (например, список адресов) будут обрабатываться ихсобственный распознаватель.Итак, я создал следующую мутацию:
Field<ContactType>("UpdateContact", "This field updates the Contact's details",
arguments: new QueryArguments(QA_Input<Types.Input.ContactInputType>()),
resolve: ctx => ContactResolvers.UpdateContact(ctx));
с ContactInputType :
public class ContactInputType : InputObjectGraphType<ContactInputDTO>
{
public ContactInputType()
{
Name = "UpdateContactInput";
Description = "Update an existing contact";
Field(c => c.Id);
Field(c => c.FirstName, nullable: true);
Field<ListGraphType<AddressInputType>, IEnumerable<AddressDTO>>("Addresses")
.Description("Manage contact's addresses")
.Resolve(ctx => LocationResolvers.ManageAddresses(ctx));
}
}
(Обратите внимание, что я использую DTO для сопоставления полей в объект, которыйв моем случае имеет смысл, но не связано с моей проблемой)
Моя проблема заключается в том, что вызывается только распознаватель ContactResolvers.UpdateContact.Преобразователь поля 'LocationResolvers.ManageAddresses' никогда не изменяется.Если я заменю поле адресов следующим:
Field(c => c.Addresses, nullable: true, type: typeof(ListGraphType<AddressInputType>));
my ContactInputDTO
заполнен правильно (т.е. его свойство 'Адреса' содержит правильные данные), но это означает, что я теряю контроль над свойствами объекта.сопоставлены и должны полагаться на то, что они имеют одинаковые имена и не могут добавить дополнительную логику, которую мог бы иметь мой распознаватель.
tl; dr Как использовать распознаватель полей с InputObjectGraphType
?Он прекрасно работает при возврате ObjectGraphType
, но я не могу заставить его работать на принимающей стороне.