3

我在 ASP.NET Web API 上工作,并通过GraphQL for .NET添加了对 GraphQL 请求的支持。我的查询按预期工作,但我现在正在努力使用与突变相同的逻辑。

我的查询有以下逻辑:

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));
    }
}

这一切都非常好,地址列表使用自己的解析器 (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>));

myContactInputDTO已正确填充(即其属性“地址”包含正确的数据),但这意味着我无法控制对象属性的映射方式,并且必须依赖它们具有相同的名称,并且无法添加我的解析器可能具有的其他逻辑。


tl;博士如何使用字段解析器InputObjectGraphType?返回时它工作正常,ObjectGraphType但我无法让它在接收端工作。

4

0 回答 0