7

J'ai regardé autour de StackOverflow pour un post similaire et oui, il y avait des discussions sur ce que je vais demander, mais j'ai décidé de commencer un nouveau sujet. Supposons que vous ayez une application qui utilise le modèle de domaine, DDD et beaucoup d'autres modèles de conception. supposons que nous avons un certain nombre de solutions énumérées ci-dessous:DDD & validation côté client

  • Solution.Model
  • Solution.Repository
  • Solution.Services
  • Solution.Presentation
  • Solution.UI.Web

La couche d'expérience utilisateur sera Solution.UI.Web et nous supposerons que ce sera une application ASP.NET WebForms. Comment appliquez-vous la validation côté client?

Il y a un certain nombre de choses à considérer:

D'abord et avant tout, nous ne devrions pas avoir à frapper le serveur d'applications/base de données (s) pour renvoyer les erreurs de validation au client, nous pourrions toutefois mettre en œuvre La validation côté serveur aussi, mais nous aurons aussi besoin d'une validation côté client. Deuxièmement, nous ne souhaitons pas implémenter les règles de validation sur la couche d'expérience utilisateur. C'est parce que si votre application est une WebApp et que vous décidez aussi de créer un client WinApp, vous devrez à nouveau implémenter les règles de validation -> cauchemar de maintenance. Une approche simple consisterait à implémenter votre logique de validation avec vos objets ViewModel (vues aplaties des entités de votre domaine qui seront envoyées au client), puis à valider ces objets avant de cliquer sur le (s) serveur (s) d'application/de base de données.

Une autre approche, que j'ai vu utilisée plusieurs fois dans différentes applications, consiste simplement à générer une collection de messages d'erreur de validation et à envoyer cette collection au client. c'est bien, mais il y a un problème. juste un simple résumé des erreurs de validation ne fera pas, surtout si vous avez un grand formulaire de saisie de données.

Maintenant, l'environnement ASP.NET MVC rend la vie beaucoup plus facile. vous pouvez utiliser EF + DataAnnotations, et MVC Scaffolding framework peut faire la plupart du travail pour vous. mais c'est le cas si vous voulez créer une application MVC et implémenter votre logique de validation avec le script jquery et java. Mais que se passe-t-il si vous avez besoin d'une approche plus générique pour implémenter un cadre de validation qui peut être utilisé et utilisé dans différentes applications, par exemple WinForms et WebForms? Juste pour clarifier, ce que je cherche est un ensemble de modèles de conception/principes et/ou techniques/cadres pour implémenter un cadre de validation qui peut être implémenté avec votre modèle de domaine et être ensuite appliqué sur vos applications client. ET -> je ne veux pas juste retourner une collection de messages d'erreur de chaîne sur les règles cassées ou quoi que ce soit, je veux pouvoir mettre à jour mes contrôles liés aux données (TextBox, ComboBox, DateTimePicker, etc) lors de l'échec de validation la couche d'expérience utilisateur serait plus intuitive (si vous voulez).

J'ai vu quelques implémentations et frameworks ici et là, et j'ai utilisé la validation côté client ASP.NET MVC depuis un moment. donc ma réponse n'a rien à voir avec la validation MVC ou JavaScript.

P.S Si vous pouviez mentionner des liens de référence, des livres, des articles, des exemples de projets et/ou inclure des extraits de code, ce serait formidable.

TNX, ARMin [:

Répondre

2

Je ne suis pas venu à travers une solution de validation englobant tous. Une raison à cela est que la logique de validation peut être subtilement différente en fonction de la couche d'application. Par exemple, toutes les règles appliquées par la couche de domaine ne peuvent pas être appliquées du côté client et il y aura toujours des cas où la validation côté client peut passer et pourtant vous devez toujours afficher un message de validation propagé à partir de la couche domaine. Cependant, le modèle de validation dans ASP.NET MVC est extensible et vous pouvez l'étendre pour prendre en charge des règles de validation supplémentaires ou créer un cadre de validation autre que DataAnnotations. Here est un exemple d'intégration du bloc Enterprise Library Validation avec ASP.NET MVC, mais comme le souligne l'article, la validation côté client n'a pas été implémentée. Une autre approche consisterait à utiliser les attributs DataAnnotations dans votre couche de domaine. L'espace de noms DataAnnotations n'est pas lié à ASP.NET MVC. Cependant, le défi dans ces approches est de propager des règles de validation à partir d'objets de domaine pour voir des modèles. En théorie, vous pouvez étendre AutoMapper de telle sorte que les règles de validation d'un modèle de domaine soient reportées pour afficher les classes de modèle, mais le coût de l'implémentation et de la maintenance peut dépasser les avantages de cette solution.

Le cadre Fluent Validation pourrait être utilisé comme point de départ pour une solution de validation englobant tout. Il y a beaucoup de examples d'utiliser ce cadre avec ASP.NET MVC.

+0

merci pour votre réponse et les liens.Vous avez raison, j'y ai réfléchi et j'ai travaillé sur quelques exemples d'applications au cours des derniers jours et aujourd'hui je viens de réaliser qu'essayer d'automatiser tout le processus de mise en œuvre de la validation côté client serait un peu exagéré. La bonne nouvelle est que l'espace de noms DataAnnotations peut être utilisé pour implémenter la logique de validation dans les entités de domaine ou les objets de modèle de vue. cela résoudra la centralisation des règles de validation. mais finalement nous allons devoir implémenter la validation sur le client nous-mêmes, ce qui n'est pas un problème. – Nexus

5

En DDD, le domaine est généralement auto-validant. En d'autres termes, les objets ne sont pas autorisés à être dans un état invalide. Les objets de valeur aident beaucoup ici. Ils encapsulent simplement les règles de formatage. Par exemple, vous pouvez avoir la classe ZipCode qui est garanti pour toujours être bien formé. Comme une responsabilité supplémentaire, il peut avoir une méthode statique comme ZipCode.TryParse ou ZipCode.Validate qui prendra une chaîne arbitraire en tant que paramètre et valider. De cette façon, la logique de validation est concentrée en un seul endroit. Si les objets de votre domaine sont accessibles directement depuis l'interface utilisateur, vous n'avez pas besoin de dupliquer cette logique ailleurs. C'est le cas pour les gros clients (Windows Forms, WPF). Malheureusement, il n'y a aucun moyen d'éviter la duplication pour les clients Web lorsqu'ils doivent effectuer une validation sans passer par le serveur.

3

Vous devez encapsuler la logique de validation dans des classes simples représentant vos connaissances de domaine. J'ai écrit à ce sujet dans mon article de blog primitive obsession. Voici comment votre contrôleur ASP.NET MVC peut ressembler si vous créez ces classes:

public class CustomerController : Controller 
{ 
    [HttpPost] 
    public ActionResult CreateCustomer(CustomerInfo customerInfo) 
    { 
     Result<Email> emailResult = Email.Create(customerInfo.Email); 
     Result<CustomerName> nameResult = CustomerName.Create(customerInfo.Name); 

     if (emailResult.Failure) 
      ModelState.AddModelError("Email", emailResult.Error); 
     if (nameResult.Failure) 
      ModelState.AddModelError("Name", nameResult.Error); 

     if (!ModelState.IsValid) 
      return View(customerInfo); 

     Customer customer = new Customer(nameResult.Value, emailResult.Value); 
     // Rest of the method 
    } 
} 

Pas besoin d'utiliser les annotations essentiellement parce qu'ils vous encouragent à dupliquer la logique de validation.

Comparer ces exemples de code:

Questions connexes