.net 热巧克力GraphQL:如何为整个架构将类型设置为可空

tquggr8v  于 2023-02-14  发布在  .NET
关注(0)|答案(1)|浏览(102)

由于我们的业务模型,我们有一个" Package 器"类型,它被实现为一个结构体。该类型可以保存一些数据,也可以是"空"的。当结构体保存一些数据时,我们想把它作为一个字符串发送,但是当它为空时,字段的值应该为null。2这很容易做到(只需要定义一个新的标量类型),但是当值为null时,HotChocolate会抛出异常,因为类型为struct的字段不能为null。
我不想注解结构体的每个示例,所以我在寻找一种通用的方法来修改正在被发现的模式。看起来使用TypeInterceptor是正确的事情,但是API的这一部分的文档几乎不存在。
你知道吗?

4dc9hkyq

4dc9hkyq1#

是的,这是正确的。你可以使用一个类型拦截器重写模式。重写方法OnBeforeRegisterDependencies。在那里你可以访问字段和定义。
然后可以重写该类型的为空性。
像这样的事情可能会起作用:

public class MakeTypeNullableInterceptor<T> : TypeInterceptor
{
    public override void OnBeforeRegisterDependencies(
        ITypeDiscoveryContext discoveryContext,
        DefinitionBase? definition,
        IDictionary<string, object?> contextData)
    {
        if (definition is ObjectTypeDefinition { Fields: var fields })
        {
            foreach (var field in fields)
            {
                if (field.Type is not ExtendedTypeReference { Type: var extendedType } typeRef)
                {
                    continue;
                }

                int position;
                for (position = 0; extendedType.ElementType is { } elementType; position++)
                {
                    extendedType = elementType;
                }

                if (extendedType.Source == typeof(T) && !extendedType.IsNullable)
                {
                    var typeInspector = discoveryContext.TypeInspector;

                    var nullability = typeInspector.CollectNullability(typeRef.Type);

                    nullability[position] = true;

                    field.Type = typeRef
                        .WithType(typeInspector.ChangeNullability(typeRef.Type, nullability));
                }
            }
        }
    }
}

相关问题