Средство распознавания полей для InputObjectGraphType - PullRequest
0 голосов
/ 11 декабря 2018

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

...