使用C#进行热巧克力验证

问题描述

所以最近我一直在和Hotchocolate玩耍,我开设了一门课,给我回了一个学生列表,但我想为此提供一些验证功能。我没有从hotchocolate官方网站上找到任何可以帮助我的东西。

Student.cs

public class Student
{
    [GraphQLNonNullType]
    public string Name{ get; set; }
    [GraphQLNonNullType]
    public string LastName{ get; set; }
    [GraphQLNonNullType]
    public string Picture { get; set; }
}

这是我的查询,当前可以从列表中退回所有学生。

StudentQuery.cs

public class StudentQuery
{
    [UseFiltering]
    [UseSorting]
    public List<Student> GetStudents()
    {
        return MongoDBHelper.LoadRecords<Student>(EMongoCollection.Students);
    }

}

现在我的问题是,我该如何为学生制定ValidationRule,例如说一个学生的姓名必须至少包含3个字符? 有人能为我提供例子吗?

谢谢。

解决方法

HotChocolate 本身没有集成此类输入验证。 该框架仅进行 GraphQL 验证。所以检查无效的 GraphQL 查询。 (例如错误类型)

如果您想使用验证,有几个社区库可供选择:

此处列出了社区图书馆: https://github.com/ChilliCream/hotchocolate/blob/main/COMMUNITY.md

,

除了 3rd 方库.. 我们可以编写一个自定义中间件来处理从服务输出的数据的数据验证...

中间件示例代码

public class OutputValidationMiddleware
{
    private readonly FieldDelegate next;
    private readonly ILogger<OutputValidationMiddleware> logger;

    public OutputValidationMiddleware(
        FieldDelegate next,ILogger<OutputValidationMiddleware> logger)
    {
        this.next = next;
        this.logger = logger;
    }

    public async Task InvokeAsync(IMiddlewareContext context)
    {
        await next(context).ConfigureAwait(false);

        
        if (context.Result != null && context.Result is IValidatable)
        {
            var validationErrors = (context.Result as IValidatable).Validate();
            foreach (var err in validationErrors)
            {
                logger.LogWarning(err);
            }
        }

        return;
    }
}

现在您的模型需要实现如下所示的 IValidatable

   public class Test : IValidatable
   {
        IEnumerable<string> Validate()
        {
            // Validate and return any validation errors here.
        }
    }

现在我们只需要注册

 services.AddGraphQLServer().
 UseField<OutputValidationMiddleware>()

相关问答

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