se la validazione fallisce a runtime vi beccate un sana ArgumentNullException. Ci sono una notevole quantità di metodi e di extension methods che servono per validare gli scenari più disparati:readonly IEntityViewModelFactory viewModelFactory; public PaymentMethodEditorViewModel( IEntityViewModelFactory viewModelFactory ) { Ensure.That( viewModelFactory ).Named( "viewModelFactory" ).IsNotNull(); this.viewModelFactory = viewModelFactory; }
Fino a ieri aveva un solo difetto: era complessivamente complesso capire dove fosse realmente fallita la validazione perchè l’exception viene sollevata dalla libreria di validazione e non dal codice chiamante quindi l’unica possibilità era armarsi di pazienza e spulciare lo StackTrace… con l’inghippo che se il tutto è in un mondo multi-threading lo StackTrace è tutto tranne che developer friendly :-)void MyMethod( String argument ) { Ensure.That( argument ) .Named( "argument" ) .WithMessage( "...ti sei dimenticato il parametro :-)" ) .IsNotNullNorEmpty(); }
Una paio di giorni fa durante una ciaccolata con Marco De Sanctis salta fuori l’inghippo di cui sopra e stuzzicato dalla possbilità di risolverlo mi armo di curiosità e, grazie anche a uno scambio di mail con un paio di MVP d’oltreoceano (mirate a capire se c’era modo di ingannare il debugger), scopro che:
- La proprietà StackTrace della classe Exception è virtual… :-)
- c’è quindi la possibilità di manipolare a runtime lo StackTrace e rimuovere le informazioni che non servono…;
- …ma questo probabilmente è poco bello oltre al fatto che comporterebbe una gerarchia custom di Exception;
produca questo:static void Main( string[] args ) { try { Ensure.That( args ) .Named( "args" ) .WithMessage( "Missing console arguments." ) .IsFalse( v => v.Length == 0 ); } catch( ArgumentException e ) { Console.WriteLine(e); } Console.Read(); }
Sempre perchè anche il developer vuole la sua parte :-)
.m
Imported comment, original author: raffaeu
ReplyDeleteIl problema con te e' che:
1) Metto nei favorites ogni singolo post e quindi non funziona perche' poi non mi ricordo se una cosa l'ho gia' letta o no
2) Mi scarico offline il blog e lo stampo e ci faccio un libro ma sarebbe 'incrementale'
3) Ho la costanza di scrivere almeno un esempio stupido al giorno basandomi sul codice che scrivi. Peccato che posti almeno 2/3 perle al giorno.
Rileggendo la 'nascita' di questo parameters validator devo dire che e' davvero brillante.
:-)
Imported comment, original author: Mauro Servienti
ReplyDelete:-) grazie!
Le cose migliorerebbero se ti dicessi che molto ma molto probabilmente a breve il tutto diventerà Open Source su CodePlex?
.m
Imported comment, original author: raffaeu
ReplyDeleteCa......spita.
Sarebbe una cosa fichissima. Se hai in mente di andare su Codeplex e hai bisogno di 'manodopera', molto volentieri.
Imported comment, original author: Antonio
ReplyDeleteMauro++
speriamo di vederlo presto su codeplex :)