我在 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
但我无法让它在接收端工作。