复杂类型上的热巧克力(GraphQL)模式优先方法

复杂类型上的热巧克力(GraphQL)模式优先方法,graphql,hotchocolate,Graphql,Hotchocolate,我是热巧克力的新手,我正在尝试一些简单的用法。 我创建了非常简单的.graphql文件: #camera.graphql type Camera { id: ID! name: String! } type Query { getCamera: Camera! } 还有一个非常简单的用于相机包装的.NET代码: public class QlCamera { public static QlCamera New() {

我是热巧克力的新手,我正在尝试一些简单的用法。 我创建了非常简单的.graphql文件:

#camera.graphql

type Camera {
    id: ID!
    name: String!
}

type Query {
    getCamera: Camera!
}
还有一个非常简单的用于相机包装的.NET代码:

    public class QlCamera
    {
        public static QlCamera New()
        {
            return new QlCamera
            {
                Id = Guid.NewGuid().ToString(),
                Name = Guid.NewGuid().ToString()
            };
        }

        public string Id { get; set; }
        public string Name { get; set; }
    }
对于模式创建,也包括:

   public void CreateSchema()
   {
        string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

        var smBuilder = SchemaBuilder.New();
        smBuilder.AddDocumentFromFile(path + "/GraphQL/camera.graphql");

        smBuilder.AddResolver("Query", "getCamera", () => QlCamera.New());

        var schema = smBuilder.Create();
   }
但在最后一行,我确实得到了一个例外: HotChocolate.SchemaException:'发生多个架构错误: 字段
Camera.id
没有解析程序。-类型:照相机 字段
Camera.name
没有解析程序。-类型:照相机 "

我试图创造:

    public class QlCameraType : ObjectType<QlCamera>
    {
        protected override void Configure(IObjectTypeDescriptor<QlCamera> descriptor)
        {
            descriptor.Name("Camera");

            descriptor.Field(t => t.Id).Type<NonNullType<StringType>>();
            descriptor.Field(t => t.Name).Type<StringType>();
        }
    }

但我继续得到同样的例外

很明显,我错过了一些东西,但我不明白到底是什么。 有人能解释一下我想念什么吗


(我在文档中浏览了几次,但在那里找不到相关的帮助)

作为例外情况,我清楚地指出,“摄影机”类型/对象的特定字段(“id”和“名称”)没有左轮手枪绑定

因此,它们只需添加:

smBuilder.AddResolver("Camera", "id", rc => rc.Parent<QlCamera>().Id);
smBuilder.AddResolver("Camera", "name", rc => rc.Parent<QlCamera>().Name);
smBuilder.AddResolver(“摄影机”、“id”,rc=>rc.Parent().id);
smBuilder.AddResolver(“摄影机”,“名称”,rc=>rc.Parent().name);

就是这样。

那么这些AddResolver语句会取代他的AddResolver语句吗?或者它们是附加声明?你没有具体说明。就文档的状态而言,如果有清晰的内容,这将很有帮助。这些语句在上面的代码中放在哪里?它们是附加语句-它们不替换初始语句:smBuilder.AddResolver(“Query”,“getCamera”,“()=>QlCamera.New());它描述了getCamera查询。它们只是指定如何解析getCamera的不同字段。如果使用类型优先的方法-这不是必需的-因为模式是从类型生成的。然而,在模式优先的方法中,您必须指定如何解析所有特定字段。即使它们的名称匹配(响应字段和类型字段)。
smBuilder.AddResolver("Query", "getCamera", () => new QlCameraType());
smBuilder.AddResolver("Camera", "id", rc => rc.Parent<QlCamera>().Id);
smBuilder.AddResolver("Camera", "name", rc => rc.Parent<QlCamera>().Name);