在中对域模型实体进行服务器端验证的最佳位置/方式是什么.NET CORE Web API



我有各种对象的Domain模型。当我通过WebApi Call插入/更新/删除实体时,我希望在此之前对实体进行预验证。像For insert一样,如果employee对象的电子邮件属性已经存在,那么抛出错误,类似地,对于employee,在我真正执行insert之前,我还有其他多个数据库验证要执行。更新和删除操作也是如此,它有一些共同的和不同的验证要执行。例如:为了更新电子邮件地址,我会打一个数据库电话来检查员工是否真的存在。如果没有,则抛出错误。那么,我如何知道如果我的操作是Insert/Update/Delete操作,然后调用适当的验证方法呢?

我无法从域模型进行Db调用,因为我没有引用该项目中的数据访问层。我知道,对于范围/无效类型等常规字段验证,我可以在我的域模型中使用IValidatable。但是我该如何进行多个数据库调用呢。我有一个服务层,它目前为所有域模型的通用目的进行少数验证的Db调用。但是如何为每个域模型分离Db调用呢?

如果只有一个服务修改您的域模型(如MyDomainModelService(,则可以在那里执行所有验证检查。

如果不是这样,你可以创建一个服务来检查你的域模型的有效性,并在你需要的地方使用它:

IValidationService<MyDomainModel> _validationService;
// ...
if (!_validationService.IsValid(model)) { throw new Exception("invalid model"); }

虽然在IValidatable中可以在数据库级别上执行验证,但不建议这样做,因为您需要通过"请求访问您的数据库上下文;隐藏的";方法除此之外,验证方法不是异步的。

另一种可能性是使用验证属性,特别是[Remote]属性。然而,如果您遵循一种干净的体系结构风格,这种方法会违反一些原则。我仍然想提到它,因为在一个简单的应用程序中,它当然值得考虑。

除此之外,您还应该反思您的条件是否应该成为验证的一部分。您可以通过数据库方式使电子邮件唯一,或者,根据您使用的ORM,如果对不存在的实体/记录进行更新,则会失败(自动(。

最新更新