验证方法和返回值-异常vs模型状态vs Bool

时间:2018-10-05 23:21:34

标签: c# validation asp.net-core

我有一些规则要求在我的应用程序中进行数据验证,通常我会以三种不同的方式进行验证,而且我不确定如何验证并将信息返回给控制器以显示给用户。

我正在将房屋对象添加到街道对象。要遵循3条规则。

规则1.门牌号必须在0-10之间

方法:使用模型状态进行数据注释/验证

我通常会在模型中使用简单的数据注释来验证此规则

[Range(0,10, ErrorMessage = "Blah blah blah")]

然后在控制器中执行ModelState.IsValid检查。

规则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。

其余

所有我的视图/ viewModels都设置为在需要时返回状态消息以及用户信息。

这似乎与在三个位置以三种方式发生的业务规则验证完全脱节。

  1. 控制器检查模型状态
  2. 服务层检查手动编码的规则
  3. 违反流畅的API设置时,数据库抛出SqlException

我觉得我应该将我的Validation合并到一个位置,并且我敢肯定这应该在服务层中完成。我已经做了一些研究,并在权衡以下几点

  1. 有人说我不应该将模型状态传递给Service层,因为这不利于分离关注点,也不利于Fluent API验证引发异常。
  2. 从服务层到控制器的所有事物都抛出太多异常似乎很容易解决,但很麻烦
  3. 流利的API验证会引发异常,因此我必须以某种方式处理并组合“模型状态”和这些异常。

我知道其中有些可能是个人喜好。但是,您将如何整合这三种方法,又如何将必要的信息返回给控制器以传递到视图?

0 个答案:

没有答案