热巧克力中基于注释与代码优先

问题描述

Hot Chocolate 中的 Code-FirstPure Code-FirstAnnotation-Based 之间有什么区别,以及 GraphQL 中每种编码方法的优缺点是什么架构视角和 Hot Chocolate 内部?

解决方法

Pure Code First 已重命名为 Annotation Based。所以这两个是一样的。

这取决于您最终将使用的架构和品味。您不必首先使用代码或基于注释,您也可以混合搭配。

HotChocolate 默认推断所有属性及其类型。意思是,当您返回 User 时,它会自动为它创建一个类型,其中包含用户拥有的所有属性。 如果您想更改类型的配置,您可以使用我们的注解或创建一个 ObjectType`

在幕后,所有方法(甚至是模式优先)都具有相同的表示。它们都转化为 code-first 方法。

在代码优先的方法中,您使用类型继承和流畅的 API 来配置类型

public class User 
{
   public string Id {get; set}
}

public class UserType : ObjectType<User>
{
    protected override void Configure(IObjectTypeDescriptor<User> descriptor) 
    {
        descriptor.Field(x => x.Id).Type<IdType>();
        descriptor.Field<Resolvers>(x => x.GetAddressAsync(default,default));
    }

    public class Resolvers 
    {
        public Task<Address> GetAddressAsync(
           [Parent]User user,[Service]AddressRepo repo) => repo.GetAddressByUserAsync(user.Id);
    }
}

在基于注解的方法中,您可以使用注解来自定义类型:

public class User 
{
   [GraphQLType(typeof(IdType))]
   public string Id {get; set}
}

[ExtendObjectType(nameof(User))]
public class UserAddressExtensions 
{
   public Task<Address> GetAddressAsync(
      [Parent]User user,[Service]AddressRepo repo) => repo.GetAddressByUserAsync(user.Id);
}

尽管两种方法同样强大且具有相同的功能,但使用一种方法还是有一定的好处。

如果您无权访问域模型,或者不想为其添加属性,您可能会发现代码优先方法更易于使用。当您想要选择退出类型推断并指定要在架构中公开哪些字段时,情况也是如此。

基于注释的方法通常可以保护大量样板代码,如果您先编写代码,则您需要这些代码。如果您发现自己在 api 上公开的属性多于隐藏的属性,您可能会发现基于注解的方法更优雅。如果你使用注解,通常你的代码会更少更干净

我们经常看到的是两种方法的结合。在 GraphQL 域中的所有内容使用注解和配置域模型的地方,使用代码优先类型。

尽管使用 11.2 中发布的新属性,您甚至不再需要代码优先类型。您还可以使用属性和类型扩展更改、忽略或替换字段。您还可以使用 [UnionType][InterfaceType] 定义联合和接口 https://chillicream.com/docs/hotchocolate/defining-a-schema/extending-types/

,

基于注解或纯代码优先:在这种方法中,我们不关心 GraphQL 模式类型,我们将编写干净的 C# 代码,自动转换为 GraphQL 类型。

代码优先:在这种方法中,我们使用 Schema types架构类型允许我们将 GraphQL 类型配置与我们的 .NET 类型分开。 当我们不希望业务对象具有任何 Hot Chocolate 属性时,这可能是正确的方法。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...