Si vous avez besoin d'une liste d'échecs (et non d'exceptions à la fois), alors j'aime le bloc Validation de la bibliothèque d'entreprise.
Voir la présentation powerpoint à: http://msdn.microsoft.com/en-us/library/ff650484.aspx
Vous pouvez câbler les plus élémentaires contre les validations de vos objets POCO. Et beaucoup de règles préfabriquées peuvent être installées dans un fichier .config.
Et vous pouvez écrire vos propres règles.
Mes règles sont très granulaires. Ils effectuent 1 validation à la fois.
À titre d'exemple simple: j'aurais deux règles différentes pour décider si un employé est disponible (en fonction de la date de naissance). Une règle assurerait que la date de naissance de l'employé a été spécifiée.
Une deuxième règle permettrait de s'assurer que la date du jour moins la date de naissance était supérieure à 18 ans. (ou quelle que soit la règle).
(Supposons maintenant que j'ai un tas de règles en place). Donc, après l'exécution des routines de validation, je récupère une liste de toutes les situations (invalides) dans une liste. Par exemple, si je validais un employé, j'obtiendrais une liste d'invalidité.
"N'a pas fourni LastName"
"N'a pas fourni FirstName"
"N'a pas fourni SSN"
au lieu de "un à la fois". (le faire "un à la fois" prendrait potentiellement plusieurs passes pour finalement comprendre la validité de vos chèques).
Voici un exemple de code. Disons que quelqu'un a essayé d'acheter un livre avec ISBN "ABC123456". La règle ci-dessous est une règle personnalisée qui vérifie si ce livre existe (dans votre base de données de produits par exemple). Je pense que vous pouvez suivre. Il serait câblé contre l'objet poco Book (.cs). (Aucun "fil" n'est affiché). J'essaie simplement de vous donner un exemple rapide de la difficulté (ou non) de créer une règle simple.
Lorsqu'un livre n'est pas trouvé (en utilisant isbn) .... alors vous voyez la méthode validationResults.AddResult. Voilà comment vous obtenez plusieurs invalides. Vous aurez accès à la collection plus tard lorsque vous vérifiez la requête de validation.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
namespace MyCompany.Applications.MyApplication.BusinessLogic.Validation.MyType1Validations
{
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class BookExistsValidatorAttribute : ValidatorAttribute
{
protected override Validator DoCreateValidator(Type targetType)
{
return new BookExistsValidator("BookExistsValidatorTag");
}
}
public class BookExistsValidator : Validator<string>
{
public BookExistsValidator(string tag) : base("BookExistsValidatorMessageTemplate", tag) { }
protected override string DefaultMessageTemplate
{
get { throw new NotImplementedException(); }
}
protected override void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults)
{
bool bookExists = BookMatchExists(objectToValidate);
if (!bookExists)
{
string msg = string.Format("The Book does not exist. Your ISBN='{0}'", objectToValidate);
validationResults.AddResult(new ValidationResult(msg, currentTarget, key, 10001, this)); /* 10001 is just some number I made up */
}
}
private bool BookMatchExists(string isbn)
{
bool returnValue = false;
IBookCollection coll = MyCompany.Applications.MyApplication.BusinessLogic.CachedControllers.BookController.FindAll(); /* Code not shown, but this would hit the db and return poco objects of books*/
IBook foundBook = (from item in coll where item.ISBN.Equals(book, StringComparison.OrdinalIgnoreCase) select item).SingleOrDefault();
if (null != foundBook)
{
returnValue = true;
}
return returnValue;
}
}
}
Avez-vous trouvé des avantages/des inconvénients comparaisons de cadres différents? –