在模型或ViewModel上使用带有MVC(MVVM)的ViewModel时,验证应该驻留在哪里?(或两者兼而有之)?为什么?我特别考虑到ASP.NET MVC的V2即将推出,我提出这个问题.
复杂/自定义验证怎么样?
我正在开发一个带有3层经典架构的ASP.NET MVC应用程序1.数据访问(Repositories)2.业务逻辑(Services)3.应用层(MVC Controller类)任务是遵循领域类Learner和学习者可以参加考试,参加考试会产生一个订单(订单类),之后学习者参加考试,我们需要为每个学习者发布考试成绩(这意味着给出一个分数和成绩)并且有一些需要的商业规则已验证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);
}
Run Code Online (Sandbox Code Playgroud)
控制器类
public ActionResult Release(EncryptedId orderId)
{
Check.Require(orderId …Run Code Online (Sandbox Code Playgroud)