Средство распознавания полей для InputObjectGraphType
Я работаю над 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>));
мой ContactInputDTO
заполнен правильно (т. е. его свойство 'Адреса' содержит правильные данные), но это означает, что я теряю контроль над тем, как сопоставляются свойства объекта, и вынужден полагаться на то, что они имеют одинаковые имена, и не может добавить дополнительную логику, которую мог бы иметь мой распознаватель.
tl; dr Как использовать распознаватель полей с InputObjectGraphType
? Работает нормально при возврате ObjectGraphType
но я не могу заставить его работать на приемной стороне.