我的应用程序中有需要数据验证的规则,我通常会以三种不同的方式进行验证,我不确定应该如何验证并将信息返回控制器以显示给用户。
我正在将房屋对象添加到街道对象。有三条规则要遵循。
规则1。门牌号必须介于0-10之间
方法:使用模型状态进行数据注释/验证
我通常会在模型中用一个简单的数据注释来验证这个规则
[Range(0,10, ErrorMessage = "Blah blah blah")]
然后做一个模型状态。是否有效签入控制器。
规则2。门牌号和街道名称的组合必须是唯一的
方法:Fluent API/将引发SqlException
我通常会用Fluent API实现这些规则,如下所示
builder.Entity<Street>(b =>
{
b.HasIndex(e => new { e.HouseNumber, e.StreetName }).IsUnique();
});
当我试图将它添加到数据库时,我希望它会抛出一个异常,我会在服务层捕获它。
规则3——这条街上的房子不能超过10栋
方法:服务层检查,并抛出异常或返回false
我通常会让我的控制器调用服务层,在调用存储库保存数据之前,服务层会检查业务规则。如果它失败了一条规则,它会抛出一个异常。
throw new CreateHouseException("Street has reached maximum capacity");
或者干脆让方法返回false。
剩下的
我的视图/视图模型都设置为在需要时返回状态消息,并向用户提供信息。
所有这些似乎都与业务规则验证在三个地点以三种方式发生的情况非常脱节。
-
控制器检查模型状态
-
服务层检查手动编码的规则
-
违反fluent API设置时,数据库引发SqlException
我觉得我应该将验证整合到一个位置,我确信这应该在服务层完成。我做了一些研究,正在权衡以下几点
-
有人说我不应该将模型状态传递给服务层,因为这不利于分离关注点,也无助于处理Fluent API验证引发的异常。
-
从服务层到控制器,抛出太多异常似乎是一个简单的解决方案,但很麻烦
-
fluent API验证会引发异常,因此我必须以某种方式处理并组合模型状态和这些异常。
我知道其中一些可能是个人喜好。但是,您将如何整合这三种方法,以及如何将必要的信息返回给控制器以传递给视图?