2010-07-11 20 views
5

Mentre cercavo qualcosa di totalmente diverso l'altro giorno, mi sono imbattuto in due librerie per fare Fluent Validation in .NET. Il concetto sembra interessante poiché finora sto facendo le mie validazioni usando le consuete dichiarazioni condizionali e ramificate (se, altrimenti, caso, ecc.).Validazione e librerie fluide

In particolare, rende relativamente semplice concatenare alcune condizioni che potrebbero causare in alcuni casi un codice più breve per condizioni complesse e incorporare diversi messaggi di errore per ciascuna violazione nello stesso oggetto.

Detto questo, non sta anche rendendo il codice più dettagliato di C# di solito, un po 'come può essere T-SQL a volte ... e questo non fa sì che il codice abbia un aspetto inconsistente e sentire?

In breve, cosa ne pensi di Fluent Validation e se ti piace, quale libreria hai trovato il migliore? Finora, ho visto http://tnvalidate.codeplex.com/ e http://fluentvalidation.codeplex.com/ che sembrano più o meno equivalenti a prima vista ...

Grazie.

risposta

2

Sto utilizzando la mia libreria di convalida che ho pubblicato here.

La differenza con i due suggeriti è che le convalide vengono inserite in classi di convalida separate. È possibile creare e dimenticare le classi di convalida, vengono automaticamente rilevate dalla libreria di convalida.

public class MyModelValidator : FluentValidator<MyModel> 
{ 
    public MyModelValidator() 
    { 
    Property("FirstName").Required(); 
    Property("LastName").Required().Min(15); 
    } 
} 

E 'anche facile da aggiungere il supporto per le localizzazioni che usano il vostro molto proprio libray localizzazione preferita (ad esempio una tabella di stringhe)

public class StringTableProvider : ILanguagePrompts 
{ 
    public string this[string modelName, string propertyName] 
    { 
     get { return Get(modelName, propertyName) ?? "[" + propertyName+ "]"; } 
    } 

    public string Get(string modelName, string propertyName) 
    { 
     return Resource1.ResourceManager.GetString(modelName + "_" + propertyName); 
    } 
} 

e di configurare:

Validator.LanguageHandler = new StringTableProvider(); 

La validazione effettiva è fatto così:

User user = new User(); 
user.FirstName = "Jonas"; 

var errors = Validator.Validate(user); 
if (errors.Count > 0) 
{ 
    // Handle the errors in any way you like. 
    // both property names (localized and actual property name) and localized error message is accessible. 
} 
2

Mi sono imbattuto in qualcosa di simile per conto mio, e l'ho scritto precisamente in modo che il codice fosse MENO verboso.

io ho la mia convalida dove faccio le cose come:

Validation.IsNullOrEmpty(m => m.FirstName, modelState); 
Validation.Validate(m => m.ZipCode, z => z.Length == 5, modelState, 
"ZipCode must be 5 characters long"); 

Ora questo è legata molto strettamente con l'architettura MVC sto usando, ma trovo che sia più facile da leggere e mantenere di:

if (string.IsNullOrEmpty(FirstName)) 
{ 
    ModelState.AddError("FirstName", "FirstName cannot be empty."); 
} 

In questo contesto, non è così evidente, ma quando lo fai la convalida, è possibile avere elementi mOLTI per convalidare, in modo che le navi da uno diventato molto più facile per eseguire la scansione e capire cosa la convalida sta facendo.

Hai la prima volta in cui ti imbatti nel primo codice che ho messo lì e devi capire cosa sta succedendo, ma una volta superato questo, penso che un gruppo di un liner sia più facile per gli occhi rispetto ai blocchi multipli che produrrà il secondo metodo.

4

C'è anche http://rulesengine.codeplex.com/ che utilizza una classe helper dell'interfaccia fluida per aggiungere regole a un motore (che viene quindi utilizzato per convalidare oggetti).

Supporta Composizione, Cross-Field, Condizionale, multi-lingue, ecc ...

+0

Molto bello, grazie. –