Qual é a melhor maneira de validar regras de negócios no aplicativo ASP.NET MVC com arquitetura de 3 camada

Estou desenvolvendo um aplicativo ASP.NET MVC com arquitetura clássica de 3 camadas 1. acesso a dados (repositórios) 2. lógica de negócios (serviços) 3. camada de aplicativo (classes MVC Controller) A tarefa é seguida: classe de domínio: alunos e alunos pode fazer exames, fazer um exame produzir um pedido (classe Order), depois que o aluno realizar um exame, precisamos liberar os resultados do exame para cada aluno (isso significa dar uma nota e nota) e tem alguma regra comercial que precisa ser verificado 1. os resultados ainda não foram divulgados 2. todo aluno com status presente deve ter nota 3. limite de classificação deve ser confirmado (notas e nota para exame) Quando o usuário divulga resultados, todas essas regras devem ser validadas e se alguma regra não satisfeita deve exibir uma mensagem de erro. Decidi que todas as lógicas relacionadas às regras de negócios de validação permanecem na classe Service e, se alguma regra não passar, lança uma exceção específica, na classe do controlador, essa exceção capturará e exibirá erro para o cliente. Aqui está o código

Classe de serviço

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

Não tenho certeza se essa é a melhor maneira de validar regras de negócios. Alguém pode me ajudar com sugestões ou uma solução melhor para esse problema? Desde já, obrigado

questionAnswers(2)

yourAnswerToTheQuestion