HotChocolate.AspNetCore如何配置默认非空类型并按需设为可空?
HotChocolate.AspNetCore 类型可空性配置实现说明
默认将字符串、自定义类等引用类型设为非空的能力
这种全局默认配置是完全支持的,框架原生就提供了对应的调整入口:
- HotChocolate 13.0 及以上版本,在服务注册阶段可以通过
AddGraphQLServer()链式配置的可空性规则开关,直接把全局默认的引用类型可空判定逻辑反过来——没有显式标注为可空的引用类型(包括string、自定义业务类等),会自动映射为GraphQL规范里的非空类型(对应SDL里带!后缀的类型) - 如果你的项目开启了C#官方的可空引用类型(NRT)上下文,框架不需要额外全局配置,会自动联动代码里的可空标注生成对应的GraphQL可空规则:
string、非空自定义引用类型会自动生成非空字段,string?、可空自定义引用会自动生成可空字段
特殊可空需求的配置方式
在全局默认非空的规则下,针对特定字段、特定类型的可空设置,两种常规方案都可以落地实现:
- 特性标注方式:不需要自行定义特殊的NullableType类,直接在需要调整可空性的属性、字段上标注框架内置的
[Nullable]特性,就可以覆盖全局的默认非空规则,把该位置映射为可空类型;反过来如果全局是默认可空规则,需要把某个字段设为非空,就标注[NonNullable]即可 - 类型描述符方式:使用Code First模式下的自定义类型描述类,可以直接在字段配置环节显式指定可空性,比如通过
descriptor.Field(x => x.Description).Type(x => x.NullType())的写法,强制把对应字段设为可空;如果需要批量调整,也可以自定义全局类型约定规则,匹配特定类型批量修改可空属性,不用逐个字段打标
实际落地注意点
- 代码层面的C#可空标注优先级高于全局默认规则:如果全局设置了默认引用类型非空,但某字段本身标注了
string?,框架会直接按代码标注生成可空字段,不需要额外手动配置- 如果使用SDL优先的Schema First模式,可空性以.graphql文件里的显式标注为准,上面提到的全局配置、特性标注都不会覆盖SDL里的类型定义
内容的提问来源于stack exchange,提问作者Chameleon
相关产品推荐
相关产品推荐

