Как лучше проверить бизнес-правила в приложении ASP.NET MVC с трехуровневой архитектурой? - PullRequest
9 голосов
/ 03 июня 2011

Я занимаюсь разработкой приложения 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);
    }

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

Ответы [ 2 ]

6 голосов
/ 03 июня 2011

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

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

5 голосов
/ 03 июня 2011

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

Как правило, при работе с веб-приложением 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...