针对数据库的Webapi验证

时间:2015-06-23 08:13:45

标签: c# .net entity-framework asp.net-web-api ninject

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

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

当在移动设备上创建新任务并调用API以在服务器上创建此任务时,我需要执行一些验证。使用DataAnnotations属性可以非常轻松地执行验证,例如,如果需要提交字段或在Range范围内或不在[AssertThat("CurrentUserBelongsToThatFarm(FarmId)")] public Guid FarmId {get; set;} 范围内。

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

  • 当前用户(来自上下文)属于指定的Farm
  • AssignedUser属于指定的Farm
  • 字段属于指定的Farm,AssignedUser分配给处理此字段的组

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

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

唯一的问题,验证在json脱盐期间运行,在代码进入我的控制器操作之前,我无法弄清楚如何注入数据库上下文以便它可用于验证功能。那我当然可以直接从IoC容器中查询它,但我宁愿不这样做。

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

更新

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

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

application.yml

用于为GET调用生成json的模型类与EF Entites是分开的,因为数据库模式与API对象模型不完全匹配。

1 个答案:

答案 0 :(得分:0)

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

我将所有验证分成两组&#34;立即&#34;这是基于属性的,不需要数据库和&#34;数据库&#34;。如果有任何&#34;立即&#34;验证失败,请求失败并将这些错误返回给客户端。理论上,如果客户端没有正确地验证这些客户端,那么这些应该只会失败。否则这些将永远成功。

如果&#34;立即&#34;验证成功,我运行&#34;数据库&#34;每个对象的验证。我坚持更改数据库以获取通过验证的更改并返回没有的对象的错误。

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