Obiettivi della Janky.Validation
Gli obiettivi della libreria in breve sono:
1. Ottenere più tempo libero per le pause caffè e per stuzzicare le segretarie o le consulenti carine dei rispettivi posti di lavoro
2. Supportare la Validazione per Contesto
3. Fornire una libreria di
Rules pronte all'uso
4. Dare la possibilità di estendere la libreria delle Rules definendo delle Custom Rule
5. Supportare la validazione per gruppi di regole in OR, oltre che in AND
6. Dare la possibilità di ereditare un custom
ValidationContext da altri custom
ValidatorContext con nuove regole, favorendo il riutilizzo
7. Dare la possibilità ai designer di interfaccia di poter continuare a usare errorProvider e/o validator control.
Come potete vedere, gli obiettivi sono ordinati per Importanza decrescente...:-)
ecco la
jankySoluzione:
Tutto ruota attorno a due classi astratte, come prevedibile:
RuleBase,
ValidationContext.
La libreria di rules fornite e le eventuali custom rules devono ereditare da
RuleBase, mentre per definire un proprio contesto di validazione bisogna ereditare da
ValidationContext. Ogni context ha una lista di rules definibili, un metodo initialize (di cui fare l'override) in cui creare rules e semplicemente aggiungere alla lista.
Il contesto fornisce quindi dei metodi di istanza quali BrokenRule() che restituisce le regole non valide, vari metodi ToString() per restituire tutti gli errori di validazione in modo formattato e altre particolarità.
Come usare i contesti di validazione? Ecco cosa può fare lo sviluppatore:
Creiamo una classe concreta
SavingValidation() e dentro il metodo
Initialite() mettiamo le nostre regole. Se il nostro applicativo prevede altri contesti di validazione che aumentano le regole di
SavingValidation() possiamo estendere quest'ultimo e sempre in
Initialize() (con un piccolo accorgimento) aggiungere le sole regole in più...
Non mostrato nel grafico, ma perfettamente possibile è anche la possibilità di aggiungere regole da un contesto ad un altro senza necessità di ereditare...
un semplice
.AddRange() e via.
Rules di Libreria già disponibili
Piccola panoramica su quali funzioni sono già disponibili come regole di validazione:
ValueComparisonRule: compara il valore fornito con altro valore specificando l'operatore: >, >=, = <, <=
DateComparisonRule: come sopra ma con data
ValueInRangeRule: verifica se il valore fornito rientra nel range di valori, specificando agli estremi l'operatore: >, >=, = <, <=
DateInRangeRule: come sopra ma con data
MatchRegexRule, IsNumericRule, IsDateRule, IsNotEmptyRule, IsUrlRule, StringLenghtRule: regole sono autoesplicative...
e le 2 importanti regole composte:
ConditionalRule: è una regola che valuta una condizione, e se vera introduce una specifica regola nel contesto, in caso negativo ne introduce un'altra.
JoinedRule: è una regola che fornisce una "serie" di regole. La
JoinedRule è valida quando almeno una delle regole fornite è vera. (Valutazione in OR)
La classe ValidationContext
Ecco i membri più importanti della classe.
Contiene semplicemente una lista tipizzata di
Rules. Per aggiungere regole di validazione basta un
Rules.Add(), Rule di libreria o custom, oppure anche una Rule composita. Se volessi importate le regole da un altro
ValidatorContext possiamo usare
Rules.AddRange(otherValidatorContext.Rules)
Il metodo
IsValid() scorre le regole della lista Rules, le valida singolarmante, il risultato della validità è calcolato in AND per tutte le regole.
Se ci sono JoinedRules, le regole associate a quest'ultima vengono singolarmente validate, il risultato della JoinedRules è calcolato in OR, e la Joined va in AND con tutte le altre regole.
Esempio:
Rules.Add(new aRule());
Rules.Add(new bRule());
Rules.Add(new JoinedRule(new cRule(), new dRule(), new eRule()));
Rules.Add(new fRule());
corrisponde a fare un operazione logica del tipo:
aRule AND bRule AND (cRule OR dRule OR eRule) AND fRule.
La property
BrokenRules restituisce una lista di
Rule non validate (vedremo poi come linkarle alla form), oppure abbiamo anche una
BrokenRuleDictionary per chi non vuole referenziarsi il Janky.Validation nello UI Layer.
I vari
ToString() e override si occupano di formattare in diversi modi una stringa con tutti gli errori per chi non vuole lavorare nella UI.
Basta con la fuffa...formuliamo un problema di business reale e vediamo come usare la Janky.Validation...
Per ottenere il codice per adesso mandatemi un feedback e ve lo spedisco...più tardi cerchero di piazzarlo in un posto raggiungibile..
(a seguire la terza parte)