Какой лучший способ проверки бизнес-правил в приложении ASP.NET MVC с трехуровневой архитектурой?

Я разрабатываю приложение 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);
    }

Я не уверен, что это лучший способ проверки бизнес-правил. Может ли кто-нибудь помочь мне с предложениями или лучшим решением этой проблемы? Заранее благодарим!

9
задан Serghei 3 June 2011 в 09:08
поделиться