Подтвердить что ты не робот

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

Я разрабатываю приложение ASP.NET MVC с 3-слойной классической архитектурой 1. доступ к данным (репозитории) 2. Бизнес-логика (услуги) 3. Уровень приложения (классы контроллера MVC) Задача состоит в том, что есть класс домена Learner, и учащиеся могут сдать экзамены, сдав экзамен на заказ (класс заказа), после чего ученик сдает экзамен, нам нужно выпустить результаты экзамена для каждого ученика (это означает, что он дает оценку и оценка) и имеет некоторые правила ведения бизнеса, которые необходимо проверить 1. результаты еще не выпущены 2. все учащиеся, у которых есть статус, должны иметь отметку 3. Градация градуировки должна быть подтверждена (оценки и оценка для экзамена) Когда пользователь выпускает результаты, все эти правила должны проверяться, и если какое-то правило не выполняется, должно появиться сообщение об ошибке. Я решил, что вся логика, связанная с бизнес-правилами валидации, хранится в классе Service, и если какое-либо правило не проходит конкретное исключение throw, в классе контроллера это исключение будет ловить и отображать ошибку клиенту. Вот код

Класс обслуживания

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

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

4b9b3361

Ответ 1

Я бы избегал использования исключений для целей проверки, а скорее имел методы, возвращающие true/false. Очевидно, что для некоторых задач, где валидация - это данные на уровне данных (например, принудительное ограничение базы данных), вы можете использовать исключения.

Вы можете взглянуть на следующий учебник по на уровне обслуживания.

Ответ 2

Прежде всего, не выбрасывайте Исключения как способ проверки данных - это слишком дорогостоящая операция, а не грациозная обработка недействительных данных.

В общем, при работе с веб-приложением MVC/ASP.NET вы обычно хотите выполнять проверку как на стороне клиента, так и на стороне сервера. Хотя ваша текущая пользовательская проверка достаточно проста, вам придется дублировать ее на клиенте и сервере, что раздражает - теперь у вас есть два места для поддержки единой процедуры проверки.

По этой причине очень удобно использовать аннотации данных через атрибут свойств модели. Отъезд: 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