gpt4 book ai didi

c# - 针对数据库的 Webapi 验证

转载 作者:行者123 更新时间:2023-11-30 18:24:39 27 4
gpt4 key购买 nike

假设您的 webapi 调用创建了这样的数据库对象:

class Task
{
public Guid AssignedUser {get; set;}
public Guid FarmId {get; set;}
public Guid FieldId {get; set;}
... etc
}

当在移动设备上创建新任务并调用 API 以在服务器上创建此任务时,我需要执行一些验证。使用 DataAnnotations 属性可以非常轻松地执行一些验证,例如是否需要某个文件或是否在 Range 内或其他什么。

但假设我还需要验证以下内容:

  • 当前用户(来自上下文)属于指定的农场
  • AssignedUser 属于指定的农场
  • Field 属于指定的 Farm,AssignedUser 分配给处理该 Field 的组

所有这些检查都需要来自数据库的信息。我正在尝试使用 ExpressiveAnnotations和他们一起我可以做类似的事情

[AssertThat("CurrentUserBelongsToThatFarm(FarmId)")]
public Guid FarmId {get; set;}

唯一的问题是,验证在 json 淡化期间运行,在代码进入我的 Controller 操作之前,我不知道如何注入(inject)数据库上下文,以便它可用于验证功能。也就是说,我当然可以直接从 IoC 容器中查询它,但我宁愿不这样做。

是否有一种简洁的方式来执行此类验证?

更新

为了解决 CodeUniquely 在下面的评论,我想澄清一下,这是一个“偶尔连接”的场景。也就是说,大多数时候使用 API 的设备不在网络覆盖范围内,它们会不时使用 API 进行同步。

实际上,这意味着需要同步的大部分数据被聚合到零个或一个“将更新推送到服务器”调用,然后是“从服务器获取最新状态”调用。在后端使用 Sql Server 和 EF,导致多个不同(有时不相关)的实体和集合包含在单个 json 中。例如:

class TaskData
{
public IList<Product> Products {get; set;}
public Task Task {get; set}
...
}

此外,用于为 GET 调用生成 json 的模型类与 EF 实体是分开的,因为数据库架构与 API 对象模型不完全匹配。

最佳答案

我最终在这里做的是以下内容。

我将所有验证分为两组“即时”,它们基于属性并且不需要数据库和“数据库”。如果任何“立即”验证失败,则请求失败并将这些错误返回给客户端。理论上,只有在客户端没有正确验证这些客户端时,这些才会失败。否则这些总会成功。

如果“立即”验证成功,我将对每个对象运行“数据库”验证。对于通过验证的更改,我将更改持久保存到数据库中,并为未通过验证的对象返回错误。

这或多或少是@CodeUniquely 在他的评论中建议的。

关于c# - 针对数据库的 Webapi 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30997320/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com