9

私の場合、__EnumValueイントロスペクション型を拡張して、本質的に列挙値に関する追加情報を保持したいと考えています。イントロスペクションにフィールドを追加するにはどうすればよいですか。

4

1 に答える 1

12

ホットチョコレートでは、どのタイプも延長可能です。上記の場合、GraphQL の出力タイプであるオブジェクト タイプを拡張します。

そのために、単純なクラスを作成し、そのクラスにExtendObjectTypeAttribute.

[ExtendObjectType("__EnumValue")]
public class EnumTypeExtension
{
    public string GetAdditionalInfo([Parent] IEnumValue enumValue) =>
        enumValue.ContextData["additionalInfo"].ToString();
}

元の型が持つ情報を注入できることに注意してください。この例では、__EnumValue型のランタイム値を挿入して、追加情報を公開します。

上記は、次の SDL に変換されます。

extend type __EnumValue {
  additionalInfo: String!
}

最後に、型拡張をスキーマに登録する必要があります。

services
    .AddGraphQL()
    .AddQueryType<QueryType>()
    .AddTypeExtension<EnumTypeExtension>();

その後、次のようにクエリを実行できます。

query {
  __type(name: "MyEnum") {
    enumValues {
       additionalInfo
    }
  }
}

仕様が進歩するにつれて、フィールドと衝突する可能性のある新しいフィールドがイントロスペクションに導入される可能性があります。そのため、実際にフィールドを導入し、extensionsそこに拡張フィールドを配置することをお勧めします。これは、GraphQL のリクエストとレスポンスが拡張される方法に従います。

type EnumValueExtensions {
  additionalInfo: String!
}

extend type __EnumValue {
  extensions: EnumValueExtensions!
}
于 2021-02-03T09:51:17.513 に答える