使用3层体系结构validationASP.NET MVC应用程序中的业务规则的更好方法是什么?

我正在开发一个带有3层经典架构的ASP.NET MVC应用程序1.数据访问(Repositories)2。业务逻辑(Services)3。应用层(MVC Controller类)任务是遵循领域类Learner和学习者可以参加考试,参加考试会产生一个订单(订单类),之后学习者参加考试,我们需要为每个学习者发布考试成绩(这意味着给出一个分数和成绩)并且有一些需要的商业规则已validation1.结果尚未发布2.所有有身份的学员都应该有标记3.应该确认评分边界(考试的分数和等级)当用户确实发布结果时,所有这些规则应该validation,如果有一些规则不满意应该显示错误信息。 我决定所有与validation业务规则相关的逻辑都保留在Service类中,如果任何规则没有传递抛出特定exception,则在控制器类中,此exception将捕获并向客户端显示错误。 这是代码

服务类

public void ReleaseResults(long orderId) { var order =orderRepository.Get(orderId); Check.Require(order != null, "Order was not found"); if (IsOrderReleased(order)) { throw new ReleaseResultsException("The results has been already released", order.OrderNo); } if (AllLearnersHasStatusPresentAndMark(order)) { throw new ReleaseResultsException("One or more learners unmarked", order.OrderNo); } if (!GradingBoundaryConfirmed(order)) { throw new ReleaseResultsException("The Grading boundary needs to be confirmed", order.OrderNo); } foreach (var learnerDetail in order.LearnerDetails) { if (HasNotStatusPresent(learnerDetail)) { continue; } learnerDetail.SetReleasedResults(); } orderRepository.SaveOrUpdate(order); } 

控制器类

  public ActionResult Release(EncryptedId orderId) { Check.Require(orderId != null, "The parameter orderId was null"); try { orderReleaseResultsService.ReleaseResults(orderId); } catch (ReleaseResultsException e) { return Content(string.Format("Error: {0}", e.Message)); } return Content(MUI.TheResultsHasBeenReleased); } 

我不确定这是否是validation业务规则的最佳方法,任何人都可以帮我提出建议或更好地解决这个问题吗? 提前致谢!

我会避免使用exception进行validation,而是使用返回true / false的方法。 显然,对于某些validation是数据层数据的任务(例如,强制执行数据库约束),您可以使用exception。

您可以查看以下有关在服务层validation的教程。

首先,不要将exception作为一种validation数据的方式 – 这是一种过于昂贵的操作,而不是对无效数据的优雅处理。

通常,在使用MVC / ASP.NET Web应用程序时,通常需要在客户端和服务器端进行validation。 虽然您当前的自定义validation很简单,但您必须在客户端和服务器上复制它,这很烦人 – 现在您有两个地方可以维护单个validation例程。

因此,在模型属性上使用通过属性的数据注释非常方便。 查看: http : //weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

此外,您似乎需要进行自定义validation,而不仅仅是简单的必需/最大长度检查。 为此,您可以定义自己的自定义属性。 查看: http : //msdn.microsoft.com/en-us/library/cc668224.aspx以及如何为MVC创建自定义validation属性

您可能还想利用远程validation。 对于该检查: http : //bradwilson.typepad.com/blog/2010/01/remote-validation-with-aspnet-mvc-2.html和http://weblogs.asp.net/imranbaloch/archive/2011 /02/05/new-validation-attributes-in-asp-net-mvc-3-future.aspx