Средство распознавания полей для 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 но я не могу заставить его работать на приемной стороне.

0 ответов

Другие вопросы по тегам