我正在开发一个具有3层经典架构的ASP.NET MVC应用程序 1.数据访问(存储库) 2.业务逻辑(服务) 3.应用层(MVC控制器类) 任务是遵循领域类学习者和学习者可以参加考试,参加考试产生一个订单(订单类),之后学习者参加考试,我们需要为每个学习者发布考试成绩(这意味着给一个分数和等级)并有一些需要验证的业务规则 1.结果尚未公布 2.所有在场的学员都应该有成绩 3.应确认评分边界(考试的分数和等级) 当用户确实发布结果时,所有这些规则都应该验证,如果某些规则不满足,则应显示错误消息。 我决定与验证业务规则相关的所有逻辑都保留在Service类中,如果任何规则没有传递抛出特定异常,则在控制器类中,此异常将捕获并向客户端显示错误。这是代码
服务类
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);
}
我不确定这是否是验证业务规则的最佳方式,是否有人可以帮我提出建议或更好地解决此问题? 提前谢谢!
答案 0 :(得分:6)
我会避免使用异常进行验证,而是使用返回true / false的方法。显然,对于某些验证是数据层数据的任务(例如强制执行数据库约束),您可以使用异常。
您可以查看以下有关validating at the service layer的教程。
答案 1 :(得分:5)
首先,不要将异常作为验证数据的方式 - 这是一种过于昂贵的操作,而不是对无效数据的优雅处理。
通常,在使用MVC / ASP.NET Web应用程序时,通常需要在客户端和服务器端进行验证。虽然您当前的自定义验证很简单,但您必须在客户端和服务器上复制它,这很烦人 - 现在您有两个位置来维护单个验证例程。
因此,在模型属性上使用通过属性的数据注释非常方便。查看:http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx
此外,您似乎需要进行自定义验证,而不仅仅是简单的必需/最大长度检查。为此,您可以定义自己的自定义属性。查看:http://msdn.microsoft.com/en-us/library/cc668224.aspx和How to create custom validation attribute for MVC
您可能还想利用远程验证。对于该结帐: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