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
Vous devez vous connecter pour publier un commentaire.
Je voudrais éviter d'utiliser les exceptions à des fins de validation, mais plutôt des méthodes qui renvoient true/false. Évidemment, pour certaines tâches où la validation des données à la couche de données (par exemple l'application de la base de données des contraintes de), vous pouvez utiliser les exceptions.
Vous pouvez prendre un coup d'oeil à la suite de tutoriel sur la validation à la couche de service.
non, pas nécessaire. Tout ce qui est nécessaire pour le service de la couche est le
IValidationDictionary
interface. LeModelStateWrapper
de mise en œuvre qui sera transmis au constructeur de vos services seront définis dans la couche Web. Comme vous pouvez le voir dans l'exemple, leProductService
constructeur prend unIValidationDictionary
dans son constructeur, donc pas besoin de Système de référence.Web.Mvc.d'accord, à l'aide d'un ModelStateDictionary passer les erreurs de retour est une bien meilleure approche
de bien vouloir m'aider question. thnx
OriginalL'auteur Darin Dimitrov
Tout d'abord, ne pas jeter des Exceptions comme un moyen de validation des données - qui est une manière trop coûteux, au lieu de gracieux de manipulation de données non valides.
En général, lorsque l'on travaille avec un MVC/ASP.NET application web, vous souhaitez généralement de faire la validation côté client comme côté serveur. Alors que votre validation personnalisée est assez simple, vous devez reproduire sur le client et le serveur, ce qui est gênant - maintenant, vous avez deux lieux de maintenir une seule routine de validation.
Pour cette raison, l'utilisation d'annotations de données via l'attribut de vos propriétés du modèle est très pratique. Découvrez: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx
En outre, vous semblez avoir besoin de faire une validation personnalisée, et non pas de simples obligatoire/max longueur des contrôles. Pour cela, vous pouvez définir vos propres attributs personnalisés. Découvrez: http://msdn.microsoft.com/en-us/library/cc668224.aspx et Comment créer de validation personnalisée attribut pour MVC
Vous pouvez également tirer parti de validation à distance. Pour vérifier: http://bradwilson.typepad.com/blog/2010/01/remote-validation-with-aspnet-mvc-2.html et http://weblogs.asp.net/imranbaloch/archive/2011/02/05/new-validation-attributes-in-asp-net-mvc-3-future.aspx
Bon, même les idées continuent de s'appliquer. Votre custom/supprimer des validateurs peuvent valider à l'encontre de la nécessaire règles d'affaires.
l'argument sur les exceptions étant trop cher n'est pas valide dans ce contexte, ce n'est pas la raison pour éviter les exceptions, aller de l'avant, de tester la façon dont de nombreuses exceptions par seconde, vous pouvez jeter
Je ne dis pas qu'ils ne peuvent pas être traitées. Mais il est encore plus coûteux opération contre gracieusement la manipulation des données non valides.
DataAnnotations
peut être utilisée pour valider les règles d'affaires.OriginalL'auteur Kon