c# – 使用3层架构,在ASP.NET MVC应用程序中验证业务规则的更好方法是什么?

我正在开发一个具有3层经典架构的ASP.NET MVC应用程序
数据访问(存储库)
业务逻辑(服务)
3.应用层(MVC Controller类)
任务是跟随领域课程学习者,学习者可以考试,考试产生一个订单(订单类),之后,学习者参加考试,我们需要发布每个学习者的考试成绩(这意味着给一个标记和等级),并有一些需要验证的业务规则
结果尚未公布
所有具有身份状态的学员都应该有标记
应确认分级边界(考试标记和成绩)
用户发布结果时,所有这些规则应该验证,如果某些规则不满足,应该显示错误消息.
我决定与验证业务规则相关的所有逻辑都保留在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);
    }

我不知道这是否是验证业务规则的最佳方式,任何人都可以帮助我提出建议或更好地解决这个问题?
提前致谢!

解决方法

我将避免使用异常进行验证,但是方法返回true / false.显然,对于某些任务,其中验证是数据层的数据(例如强制数据库约束),您可以使用异常.

您可以查看以下关于validating at the service layer的教程.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...