Un esempio concreto...La STROZUS Finanziamenti
Siete degli sviluppatori di applicazioni, e state lavorando per il portale di back end della nota società Strozus.
La Strozus è una importante società di strozz..ehm di finanziamento il cui motto è:
"...con Strozus otterrai senza problemi il tuo finanziamento!
Nessuna garanzia, nessuna busta paga...ci basta sapere come ti chiami...e dove vanno a scuola i tuoi figli!
E se ti dimentichi di pagare una rata...Sandrone (energumeno di 200kg) viene direttamente a casa tua a ricordartelo di persona!"
(Per informazioni sulla Strozus, chiedere a quelli di Mai dire Gol, o a Paola Cortellesi...nessun riferimento a fatti e persone è casuale...)
Ecco il l vostro modello di dati:
Ed ecco le operazioni che un operatore Strozus può effettuare sulla pratica di finanziamento con le relative regole di validazione:
1. Inizializzazione (inserisce la pratica nel db)
- Codice deve matchare con uno specifico pattern
- Cliente non nullo
- Operatore non nullo
2. Approvazione (la pratica viene finanziata)
- Stesse di Inizializzazione
- L'operatore che gestisce la pratica deve avere almeno 15 pratiche concluse positivamente OPPURE deve avere 10 anni di lavoro in Strozus
- Indice Sicurezza del Cliente maggiore di 8
3. Approvazione Con Riserva (la pratica viene finanziata ma con riserva, è necessaria una visita di Sandrone...come avvertimento!)
- stesse di Inizializzazione
- Importo della Richiesta > 80000 oppure IndiceSicurezzaCliente compreso tra 6 e 8
Ecco qui tutta la solution basata su un 3tier e il codice della Janky.Validation
La definizione dei vari ValidationContext è effettuata nel BusinessLayer (in modo da poter essere riutilizzati in vari layer di presentazione):
Inserisco qui per riferimento qualche frammento di codice come riferimento, ma rimando per una visione più dettagliata direttamente al progetto. Spero di aver scritto in modo auto-parlante.
public class SavingValidation : ValidationContext
{
protected Finanziamento finanziamento;
public SavingValidation(Finanziamento finanziamento)
{
this.finanziamento = finanziamento;
}
public override void Initialize()
{
this.Rules.Add(new MatchRegexRule("Codice errato, deve essere almeno di 5 cifre", this.finanziamento.Codice, "\\d{5}"));
this.Rules.Add(new IsNotNullRule("Manca il cliente", this.finanziamento.Cliente));
this.Rules.Add(new IsNotNullRule("Manca l'operatore", this.finanziamento.Operatore));
this.Rules.Add(new ValueComparisonRule("Troppi soldi!", this.finanziamento.ImportoRichiesto, 100000, ComparisonType.LesserOrEqual));
}
}
e prossimamente si potrebbe scendere nel dettaglio di alcune chicche, come la cortocircuitazione delle regole o l'uso del context nel presentation.