Jeśli potrzebujesz listy błędów (i nie ma żadnych wyjątków), podoba mi się blok Enterprise Library Validation.
Zobacz prezentację programu PowerPoint w: http://msdn.microsoft.com/en-us/library/ff650484.aspx
Można podłączyć się najbardziej podstawowe walidacje przed obiektami POCO. I wiele wcześniejszych reguł można skonfigurować w pliku .config.
Możesz pisać własne zasady.
Moje zasady są bardzo szczegółowe. Wykonują 1 walidację na raz.
Jako prosty przykład: miałbym 2 różne zasady, aby zdecydować, czy pracownik jest do wynajęcia (na podstawie daty urodzenia). Jedna zasada zapewniałaby określenie daty urodzenia pracownika.
Druga zasada sprawiłaby, że aktualna data minus data urodzenia była większa niż 18 lat. (lub jakakolwiek reguła była).
(Teraz załóżmy, że mam kilka zasad na miejscu). Po uruchomieniu procedur sprawdzania poprawności otrzymuję listę wszystkich (nieważnych) sytuacji na liście. Na przykład, gdybym walidował pracownika, otrzymywałbym listę osób niepełnosprawnych.
"nie przewiduje LastName"
"nie podał FirstName"
"nie podał SSN"
zamiast "jednym na raz". (robienie tego "jeden na raz" zajęłoby potencjalnie wiele przebiegów, aby w końcu ustalić ważność twoich czeków).
Poniżej znajduje się przykładowy kod. Powiedzmy, że ktoś próbował kupić książkę z ISBN "ABC123456".
Poniżej znajduje się niestandardowa reguła, która sprawdzi, czy książka istnieje (na przykład w bazie danych produktów). Myślę, że możesz śledzić dalej. Byłby podłączony do obiektu poc. Book (.cs). (Nie pokazano żadnego "przewodu w górę"). Po prostu próbuję dać ci szybki przykład tego, jak trudne (lub nie trudne) jest stworzenie prostej reguły.
Gdy książka nie zostanie znaleziona (używając isbn) .... wtedy widzisz metodę validationResults.AddResult. W ten sposób dostajesz wielu inwalidów. Będziesz mieć dostęp do kolekcji później podczas sprawdzania kwerendy sprawdzania poprawności.
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;
}
}
}
Czy znalazłeś jakieś zalety/wady porównania różnych ram? –