什么是更好的方式有3层结构,以验证在ASP.NET MVC应用程序的业务规则? [英] What is better way to validate business rules in ASP.NET MVC application with 3 layer architecture?

查看:179
本文介绍了什么是更好的方式有3层结构,以验证在ASP.NET MVC应用程序的业务规则?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发3层经典建筑一个ASP.NET MVC应用程序
1.数据访问(库)
2,业务逻辑(服务)
3.应用层(MVC控制器类)
任务是跟随有域类学习者与学习者可以参加考试,参加考试产生了订单(订单班),之后学员参加考试,我们需要释放考试结果每个学习者(这意味着给一个标记和等级),并有需要核实一些业务规则
1.结果还尚未公布
2.所有学习者谁拥有状态present应该有标志
3.分级边界应该确认(商标和牌号,用于考试)
当用户不公布结果这一切的规则,应该验证,如果有的规则不能满足应该显示错误消息。
我决定与验证业务规则的逻辑都守在服务类,如果任何规则未通过抛出特定的异常,在控制器类此异常将捕获并显示错误给客户端。这里是code

I'm developing a ASP.NET MVC application with 3 layer classic architecture 1. data access (Repositories) 2. Business logic (Services ) 3. Application layer (MVC Controller classes) The task is follow there is domain class Learner and learners can take exams, taking an exam produce an order (Order class), after that the learner take an exam, we need to release results of exam for each learner(this mean give a mark and grade) and has some business rule that need to be verified 1. the results hasn't been released yet 2. all learner who has status present should has mark 3. grading boundary should be confirmed (marks and grade for exam) When user do release results all this rules should validate and if some rule doesn't satisfied should display an error message. I decided that all logic related to validation business rules keep in the Service class and if any rule not pass throw specific exception, in the controller class this exception will catch and display error to the client. Here is the code

服务类

    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);
    }

Controller类

Controller class

        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);
    }

我不知道这是否是验证业务规则最好的办法,谁能帮我建议或者这个问题更好的解决办法?
在此先感谢!

I am not sure if this is best way to validate business rules, can anyone help me with suggestions or better solution of this problem? Thanks in advance!

推荐答案

我会尽量避免使用用于验证的异常,而是有返回真/假方法。显然,对于一些任务,其中验证是在数据层的数据(例如强制执行数据库约束),你可以使用异常。

I would avoid using exceptions for validation purposes but rather have methods that return true/false. Obviously for some tasks where validation is data at the data tier (for example enforcing database constraints) you could use exceptions.

您可以看一看了解下面的教程业务层验证

这篇关于什么是更好的方式有3层结构,以验证在ASP.NET MVC应用程序的业务规则?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆