Quelle est la meilleure façon de valider les règles de gestion dans ASP.NET application MVC avec 3 couches de l'architecture?

Je suis l'élaboration d'un ASP.NET application MVC avec 3 couche classique de l'architecture
1. l'accès aux données (Référentiels)
2. La logique d'entreprise (Services )
3. La couche Application MVC (classes de Contrôleur)
La tâche est de suivre il y a de domaine apprenti conducteur de classe et les élèves peuvent passer des examens, passer un examen de produire un ordre de la classe), après que l'apprenant de prendre un examen, nous avons besoin à la presse les résultats de l'examen pour chaque apprenant(ce qui signifie donner une marque et de qualité) et a une certaine règle d'entreprise qui ont besoin d'être vérifiés
1. les résultats n'a pas encore été dévoilé
2. tout apprenant qui a le statut actuel devrait a marque
3. classement frontière devrait être confirmé (marques et de qualité pour l'examen)
Lorsque l'utilisateur n'communiqué les résultats de toutes ces règles doivent valider et si une règle n'est pas satisfait d'afficher un message d'erreur.
J'ai décidé que toutes les logiques liées à la validation des règles d'entreprise de garder dans la classe de Service et si toute règle de ne pas passer jeter exception spécifique, dans la classe du contrôleur de cette exception de capture et d'affichage d'erreur au client. Voici le code

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

Contrôleur de classe

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

Je ne suis pas sûr si c'est la meilleure façon de valider les règles d'affaires, quelqu'un peut m'aider avec des suggestions ou une meilleure solution à ce problème?
Merci à l'avance!

OriginalL'auteur Serghei | 2011-06-03