有没有一种方法可以通过引用其他类型来解析GraphQl类型?

时间:2020-05-02 16:00:17

标签: c# .net-core graphql

我使用Graphql .Net库构建GraphQl API。 以下是我们当前所拥有的域的示例,其中该区域具有采样点标识符的列表:

public class AreaRoot {
   public String Id { get; set; }
   public List<String > SamplingPointIds { get; set; }
}

public class SamplingPointRoot {
   public String Id { get; set; }
   public String Description { get; set; }
}

类型定义如下:

public class AreaType : ObjectGraphType<AreaRoot>
{
    public AreaType()
    {
        Name = "Area";
        Field(x => x.Id, type: typeof(IdGraphType));
        Field(x => x.SamplingPointIds, type: typeof(ListGraphType<StringGraphType>));
    }
}

public class SamplingPointType : ObjectGraphType<SamplingPointRoot>
{
    public SamplingPointType()
    {
        Name = "SamplingPoint";
        Field(x => x.Id, type: typeof(IdGraphType));
        Field(x => x.description, type: typeof(StringGraphType));
    }
}

是否可以在不更改域类的情况下从采样点检索所有内容?在会议GraphQL vs Traditional Rest API中,有一个例子是在25:41分钟,但这个例子是在Java中编写的,因此我们无法使用graphQl .net进行相同的操作。

下一个示例说明了我们要进行的查询的类型:

query GetAreas(){
    areas(){
        Id
        samplingPoints{
           Id
           description
        }
    }
}

问题是:如上视频所示,当我们传递采样点并对其进行解析,并检索该区域的采样点时(在某些查询中),有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题在github上解决了。对于那些尝试执行此操作的人,实际上确实很容易,我们只需要在AreaType内部安装解析器,如下所示:

public class AreaType : ObjectGraphType<AreaRoot>
{
    public AreaType(IRepository repository)
    {
        Name = "Area";
        Field(x => x.Id, type: typeof(IdGraphType));
        Field<ListGraphType<SamplingPointType>>("areaSamplingPoints",
           resolve: context =>
        {
           return repository.GetAllByAreaId(context.Source?.Id);
        });
    }
}

请注意context.Source?.Id用于访问区域ID ...

而且,如果您尝试访问顶级上下文的参数,那么,您不能按照here所述进行操作,而是可以访问传递给查询的变量,而不是访问最好,但不是最坏的,因此请使用:context.Variables.ValueFor("variableName")