9

我决定所有与验证业务规则相关的逻辑都保留在 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);
    }

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

4

2 回答 2

6

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

您可以查看以下有关在服务层进行验证的教程。

于 2011-06-03T09:10:59.637 回答
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以及如何为 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

于 2011-06-03T09:23:52.190 回答