我正在开发一个项目,该项目需要为同一模型设置不同的验证集,我们正在努力寻找处理它的最佳解决方案。
一个简化的示例可能是使用我们的客户 DTO:
public class Customer
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required] // Only required on some views
public string Title { get; set; }
}
在我们的第一个视图中,所有字段都是必需的,因为它们在 DTO 中使用 DataAnnotations 显示。
在我们的第二个视图中,FirstName 和 LastName 可能是必需的,但 Title 是可选的,甚至可能不会在视图中表示。
复杂之处在于,我们希望在我们的服务层中存在验证规则(以便我们可以在稍后使用相同的验证提供 API),它可以访问数据注释,并针对它们进行验证,报告备份如果他们不验证,则发送到 UI。
到目前为止,获胜的方法是:
- 每个视图都有一个专用的视图模型,DataAnnotations 存在于该视图模型上。
- 然后,视图模型使用 Automapper 之类的东西映射我们的域对象。
- 然后将域对象传递给存储库和服务以对它们执行操作。
这也意味着:
- 验证不会发生在服务层,因为当对象到达那里时,它们将是域对象而不是视图模型。
有没有更好的方法来为企业应用程序处理这个问题?我们还没有找到解决办法。