假设您的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;}
范围内。
但是假设我还需要验证以下内容:
所有这些检查都需要来自数据库的信息。我正在尝试使用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对象模型不完全匹配。
答案 0 :(得分:0)
我最终在这里做的是以下内容。
我将所有验证分成两组&#34;立即&#34;这是基于属性的,不需要数据库和&#34;数据库&#34;。如果有任何&#34;立即&#34;验证失败,请求失败并将这些错误返回给客户端。理论上,如果客户端没有正确地验证这些客户端,那么这些应该只会失败。否则这些将永远成功。
如果&#34;立即&#34;验证成功,我运行&#34;数据库&#34;每个对象的验证。我坚持更改数据库以获取通过验证的更改并返回没有的对象的错误。
这或多或少是@CodeUniquely在评论中所建议的。