.Net 2.0
Una raccolda di post sul nuovo framework di casa Microsoft
Premessa: ciò che scriverò è una banalità, ma secondo me in tanti non ne sono al corrente o non ci pensano. Di cosa parlo? Di cose del genere: public const int MyConst = 10;
Il danno potenziale che le costanti pubbliche possono creare alla stabilità delle nostre applicazioni è enorme.
Why? Perché le costanti non sono altro che placeholder risolti in fase di compilazione. Questo vuol dire che, finché non si ricompila, il valore non viene aggiornato.
Implicazioni?
Assembly A che definisce una costante MyConst = 10
Assembly B che referenzia Assembly A e ne utilizza MyConst
Assembly A cambia MyConst a 15
Finché non ricompilo...
Dopo il mio precedente lavoro su NHibernate, oggi Aspitalia.com ha pubblicato un mio nuovo articolo sul multithreading. Grazie mille a Daniele per lo spazio che mi ha concesso e a Ricky per la pazienza nel correggerlo! Technorati tags: Articoli, Multithreading, ASP.NET
Chi l'avrebbe mai detto che un programmino fatto in un weekend per utilizzo personale riscuotesse tutto questo successo... L'hanno provato Simone e addirittura Phil Haack, e entrambi ne hanno parlato benone nei loro blog, convincendomi a farlo diventare un progetto open source a cui si sono aggiunti come committer!! Detto, fatto, lo trovate su Google Code, rinominato per l'occasione come Blog Commander (BlogManager era già utilizzato e faceva anche un filo schifo!!). Chi vuole apportare migliorie, mi droppi una mail! Ciao! Technorati tags: Blog Commander, Tools
Bene, allora la nuova versione di Blog Manager (il nome è uno schifo, lo so) fa per voi! Qualche post fa, se ricordate, vi ho raccontato di un piccolo tool realizzato dal sottoscritto che, grazie ad un'interfaccia simil-Explorer, consente di riorganizzare velocemente tutte le categorie del blog facendo uso dei MetaWeblog API. Mi è sembrato così comodo che, dopo essere stato lì a compiacermi come un fesso (e senza cambiare le categorie), mi son detto: "ma perchè non fare lo stesso anche per i Technorati Tags, che son così pallosi da inserire nei post vecchi che ne sono sprovvisti? In...
La scorsa domenica ho dedicato un paio d'ore di tempo alla realizzazione di un piccolo tool per la gestione delle categorie sul blog, di cui parlerò più approfonditamente tra un paio di giorni (appena riesco ad ultimarlo). Come sa chiunque utilizzi abitualmente Windows Live Writer, SubText, il vecchio .Text e altri blog engine espongono una serie di servizi remoti chiamati MetaWeblog API (qui un piccolo white paper), raggiungibili all'URL http://[blogurl]/services/metablogapi.aspx Il protocollo utilizzato è XML-RPC (qui maggiori informazioni) ed è basato su uno standard di comunicazione estremamente più semplice dei Web Service tradizionali. Non trattandosi di SOAP, però, essi non sono direttamente...
E' sicuramente una best practice quella di chiudere un datareader quando questo è stato utilizzato. Consideriamo però il seguente snippet di codice: DBConnection connection;
using (connection = factory.CreateConnection())
{
DBCommand cmd = connection.CreateCommand();
// some code
DBDataReader dr = cmd.ExecuteReader();
// some code
}
Console.WriteLine(connection.State);
Il cursore non viene esplicitamente chiuso, questo è vero, ma viene comunque invocata la dispose della connection verso il DB.
Con SqlClient questo snippet funziona come previsto, stesso dicasi per OleDbClient e per Oracle.DataAccess: lo snippet stampa "Closed" sulla console e, se si disabilita il connection pool, si...
Vediamo se riesco... dato che comunque mi sembra piuttosto simile al vecchio 70-316 che ho superato circa un annetto fa, ho pensato di dare un'accelerata drastica ai miei studi e sostenerlo entro il mese di gennaio. Chissà se ce la farò! In ogni modo, ho appena acquistato i test su MeasureUp; cavoli, certo che 55€ per la versione online di 30gg non è proprio a buon mercato!!
Prendo spunto dai post di Lorenzo e di Raffo per segnalarvi un bell'articolo di MSDN Magazine di Gennaio di James Kovacs a proposito dei memory leak che possono verificarsi nelle nostre applicazioni .NET se scritte "male", anche nel caso di solo codice managed. Credo che ogni sviluppatore di buon livello debba annoverare, nel suo bagaglio culturale, la conoscenza di come funzionano le cose a basso livello, perché in alcuni casi bisogna implementare IDisposable (tempo fa ho scritto qualcosa in proposito qui), cosa sono boxing e unboxing, cosa succede quando scriviamo myButton.Click += new EventHandler(myButtonClickHandler);
o qual è l'overhead di lavoro a...
Preparato in poco tempo (un paio di weekend), passato
oggi con 896.
Per essere contento son contento, anche se ho seri dubbi sulla reale utilità
di un esame del genere: che senso ha valutare il candidato su quesiti che, 9
volte su 10, si risolvono consultando la library... mah! Nozionismo puro
e programma estremamente vasto... A me è sembrato inutilmente
complicato, fortuna che me lo son buttato alle spalle, va'...
Speriamo che quelli per win e web siano più interessanti. Sciaoooo!
powered by IMHO 1.3
Scrivo solo oggi perché ho avuto un weekend piuttosto
intenso! Che dire... contentissimo! Intanto mi sento di ringraziare Gian Maria, Diego, Stefano e tutti gli altri ragazzi per la splendida organizzazione,
per il caffé nel termos che mi ha salvato dal crollo, per i pasticcini che
invece hanno salvato Igor e soprattutto l'albero di natale aziendale, senza il
quale io e Janky non avremmo potuto sistemare le ultime robine sulle slide
durante la sessione di Simone (già... perché da che mondo è mondo, le slide
e le demo devono essere completate 30 secondi prima di parlare, altrimenti porta
sfiga).
Mi spiace di...
Stento ancora a crederci... trattengo con fatica la gioia... il domani ha tinte più rosee... piove governo ladro! E' uscita la primissima release di NHDomainMapper!! Non scrivo altro, anche perché non avrebbe senso: oramai avrete tutti abbandonato questa pagina per volare a quella del download! Una sola nota: ogni bug che troverete, sappiate che è colpa di Janky, ghghhg!!
Avvertenza: questo è un post autocelebrativo, Janky mi ha pagato profumatamente per scriverlo, quindi se vi farà venire il diabete prendetevela con lui. Windows Vista è quasi in RTM? Avete provato Orcas per la prima volta? Office 2007 lo usate già da un po'? Vi piace HappySign di Igor? STICA!!! Siete il nulla: sta per arrivare NHibernate Domain Mapper rel.0.1 alpha codename SUPERTANGA!! Ora, visto che un rilascio ufficiale non c'è ancora stato, purtroppo credo che difficilmente che ci sia qualcuno, oltre me e il bravo Sudano, in possesso di queste fantasmagoriche righe di codice C#. Tanto per dare un'ulteriore...
Prendo spunto dal recente post di Corrado per
dire che anche nelle Winforms è possibile utilizzare il databinding in senso
"lato", ossia per impostare interazioni tra gli oggetti di una form piuttosto
che per visualizzare informazioni provenienti da una fonte dati.
Sappiamo benissimo che .NET ogni oggetto è utilizzabile come sorgente
dati, quindi perché non utilizzare un Control come DataSource? Create una
winform con una CheckBox e una ComboBox, poi, nel costruttore, scrivete:
public Form1(){ InitializeComponent(); Binding b = new Binding("Enabled", checkBox1, "Checked"); this.comboBox1.DataBindings.Add(b);}
Indovinate un po' cosa accade...
powered by IMHO 1.3
La creazione di un oggetto di tipo Image da un file
nasconde una piccola insidia. Consideriamo il seguente snippet di codice:
Image myImage = Image.FromFile("filename.jpg")
Ciò che accade dietro le quinte è che nel field
internal IntPtr nativeImage
viene memorizzato un handler al file filename.jpg, che rimane aperto
finché non si richiama il metodo Dispose() di myImage. Il problema è che,
ovviamente, il file risulta bloccato e il sistema ha una risorsa impegnata;
inoltre, se dimentichiamo di effettuare la Dispose, questa situazione perdura
fino a che non viene effettuato un GarbageCollecting o, al peggio, fino alla
chiusura dell'applicazione.
Come ovviare? Personalmente, quando devo caricare un'immagine da file, faccio
così:
Image myImage;using (Image img = Image.FromFile("filename.jpg"){ myImage = new Bitmap(img);}
Il costruttore...
Un semplice esempio di come implementare il Drag'n Drop nelle nostre Windows Forms
C.p.l.
Quando ci si deve interfacciare con un webservice che
restituisce custom types, il tool WSDL.EXE provvede da solo a definire alcune
classi che rispecchiano il naming dei tipi in origine e che possono essere
direttamente utilizzate nel codice del nostro client.
Click sul titolo per leggere...
Il viewstate di ASP.NET alle volte è una gran comodità,
che però paghiamo in termini di prestazioni ad ogni postback, dato che un bel
campo hidden di grandezza che a volte può essere considerevole, è costretto ad
andare avanti e indietro tra client e server.
Click sul titolo per leggere
Quella passata è stata una settimana a dir poco
massacrante, in cui non ho avuto un solo attimo di respiro (weekend compreso).
Per fortuna mi sono buttato alcuni impegni alle spalle e all'una e spiccioli di
domenica sera ho finalmente il tempo per
installare Windows Vista Beta 2 (perché io sono tra i
comuni mortali che per il momento non hanno a disposizione un abbonamento
MSDN)
Bloggare un po'
Nelle attività che ho svolto ultimamente, mi sono ritrovato nella necessità
di invocare un Web Service sotto https senza che il server avesse a disposizione...
Validare le vostre domain entities è sempre stato un
problema? Implementare constraints in maniera dichiarativa è il vostro sogno?
Benissimo... abbiamo quello che fa per voi!
Siore e siori... Validation Application Block 0.4
Il Validation Application Block grazie agli sforzi miei e di Andrea arriva alla
release 0.4 e, per l'occasione, migra su SourceForge. Le novità introdotte rispetto alla versione
precedente riguardano essenzialmente architettura e naming (già, naming,
purtroppo vi toccherà ritoccare qua e là il codice, se utilizzavate la 0.3), ed
in particolare:
Architettura: è stato aggiunto un supporto alle validation rules (per
il momento a livello embrionale e purtroppo...
Espando un pochino il concetto espresso nel precedente post a beneficio di chi sia ignaro della questione
Nel mio caso specifico, ho la necessità di connettermi ad un servizio remoto
che mi restituisce un documento XML, che viene poi a sua volta interpretato per
creare una serie di entities del mio object model. La classe di cui può
avvalersi l'utilizzatore per ottenere le previsioni del tempo accetta nel
costruttore un oggetto di tipo IWeatherConnector, che sarà poi fisicamente
responsabile di inviare una richiesta Http, ottenere una risposta e restituire
l'XML di processare:
public class WeatherProvider: IWeatherProvider{ public WeatherProvider(IWeatherConnector connector) { .... } public CurrentConditions GetCurrentConditions (string locationId, UnitType unitType) { // metodo da testare, in cui utilizzo l'istanza di // IWeatherConnector passata nel costruttore } public Forecast[] GetForecasts (string locationId, UnitType unitType, int days) { // altro metodo da testare... stesse caratteristiche // del precedente }}
Ora... nel mio Unit Test voglio verificare che il...
Stavo rispondendo a questo post di Andrea
Moro quando alla fine mi sono reso conto di essere un po' prolisso, e allora
ho pensato di esternare le mie elucubrazioni qui
Volevo fare una piccola precisazione per quanto riguarda l'interfaccia
IDisposable, perché leggo spesso che si fa molta confusione su quest'aspetto:
richiamare il metodo Dispose *NON* serve a liberare memoria.
A cosa serve allora? Sapete che per ogni classe posso scrivere un Finalizer,
ad es. per liberare delle risorse unmanaged che la mia classe utilizza (si pensi
ad un file aperto con un'istanza di FileStream). A differenza di altri linguaggi, però,...
Premetto che non l'ho provato, provo a darci un'occhiata
stasera, ma l'idea del bravo Nikhil Kothari mi intriga parecchio: un compilatore C# che
invece di generare IL spara fuori del Javascript, con il vantaggio di avere a
monte la possibilità di scrivere script lato client con un linguaggio Object
Oriented, avere membri pubblici, privati, virtuali, interfacce, supporto
per Intellisense e Refactoring di VS2005, ecc.ecc.ecc. Mica male!! Chissà come
si comporta in quanto a compatibilità con i diversi browser!
BTW, trovate un piccolo articolo introduttivo, il download e anche
un filmato a questo link!
powered by IMHO 1.3
Dopo un minuscolo Tip pubblicato qualche giorno fa (un altro è in arrivo!!),
oggi è uscito il mio primo articolo UGIdotNet-tiano! Riguarda la creazione di
un'estensione per il class designer di VS2005 ed è frutto di un paio di giorni
di ricerche e prove intensive, vista la scarsa documentazione (facciamo pure
"quasi nulla"?) che c'è in giro sull'argomento!
Intanto ringrazio tantissimo Lorenzo "Genio
Del Male" Barbieri, perché mi ha proposto lui di scriverlo e perché ha avuto
tanta pazienza nella fase di editing, poi... Beh.. se avete 5 minuti di tempo,
provate a darci un'occhiata, mi farebbe molto piacere avere qualche...
A questo link trovate un interessante articolo introduttivo a LINQ da parte di niente-popò-di-meno-che ScottGu, e scusate se è
poco
powered by IMHO 1.3
Oggi mi è arrivata una mail che mi annunciava che l'articolo sulle Crad's Actions che ho pubblicato su CodeProject è stato
moderato e non è più una unedited reader contribution.
Questa sì che è una soddisfazione, considerando che è lì da meno di un mese e
che molti articoli attendono il lavoro dell'editor da parecchio tempo in più!
L'unico rammarico è che, d'ora in poi, non posso più modificarne il testo a
piacimento, dato che ciò che invierò dovrà essere validato prima di andare
online; peccato, perché proprio in questo weekend avrei voluto rilasciare un
aggiornamento per correggere un paio di...
Tra le varie best practice di .NET, una che ho sentito
n-mila volte e ho metabolizzato senza (mea culpa) indagare ulteriormente è
quella di ereditare ogni custom exception dalla classe ApplicationException piuttosto che direttamente da System.Exception.
Ok, riconosco l'errore di essere stato poco curioso, ma
ieri sera, scoprendo qual è la vera realtà dei fatti, non ho potuto far a meno
di sorriderci un po' su! Parola di Jeffrey Richter, l'intenzione
originaria di Microsoft era tutt'altro che sbagliata: le eccezioni sollevate
dall'applicazione dovevano ereditare tutte da System.ApplicationException, mentre quelle sollevate dal
CLR in risposta ad errori di sistema dovevano appartenere alla gerarchia...
Già, purtroppo non codice! Ho infatti sfruttato il ponte
del primo maggio pubblicando un aggiornamento per il mio articolo su CodeProject e scrivendo un paio di testi nuovi.
Che dire... non sono un grande amante di tutto ciò, lo ammetto, anche se poi
ricevere feedback da chi ha dedicato qualche minuto a guardare il tuo codice è
sempre un qualcosa che ti riempie d'orgoglio!
Per chi ha scaricato le Crad's Actions, ho rilasciato una nuova versione che offre
un maggiore supporto all'espandibilità; la cosa che mi dà in assoluto più
soddisfazione è la nuova implementazione del CollectionEditor, che ora è capace
di...
Sto facendo alcuni esperimenti estendendo il class
designer di Visual Studio (se avrò successo ne parlerò in un prossimo post) e mi
son trovato nella necessità di inserire delle parentesi graffe all'interno di
una String.Format. Visto che alle volte la soluzione
può non essere banale, vi segnalo questa piccola FAQ di Brad Abrams che ho
scovato e che magari può essere utile.
Ciao
powered by IMHO 1.3
Nei giorni scorsi ho ricevuto un feedback da un ceco
(nel senso che abita in Repubblica Ceca ) che aveva scovato la
mia piccola libreria per puro caso, dicendo che secondo lui avrei dovuto
metterla in un posto che le garantisse una maggiore visibiltà.
Io e il mio inglese maccheronico ci siam messi al lavoro e ho partorito un articoletto per CodeProject. Che dire,
ricevere i primi rating positivi è una soddisfazione grandissima! Ora spero
anche in qualche feedback in modo da poter evolvere il lavoro sin qui
svolto.
powered by IMHO 1.3
Chi sviluppa componenti con supporto al designer di
VisualStudio, sicuramente si è trovato ad utilizzare la proprietà DesignMode per verificare se il codice sia in esecuzione
nel contesto del designer o a runtime.
Bene, avevo un problema che mi ha portato ad indagare su come funzioni
internamente questa proprietà. Reflector alla
mano ho scoperto che, in un Component...
protected bool DesignMode{ get { ISite site1 = this.site; if (site1 != null) return site1.DesignMode; return false; }}
Ora... premesso che, se utilizziamo VisualStudio, a
design time il field site è un'istanza di
System.ComponentModel.Design.DesignerHost.Site e che quel
site1.DesignMode ritorna sempre true, c'è da fare
un'importante considerazione: durante l'esecuzione del costruttore del
Component, DesignMode è SEMPRE false, perché il corrispondente Site non
è...
Sicuramente tutti voi avrete notato che, nel template
utilizzato da VS2005 per il metodo main dei nostri progetti windows forms,
c'è una riga che recita
Application.SetCompatibleTextRenderingDefault(false);
Di cosa si tratta? L'ho scoperto ieri sera, cercando di
utilizzare anche in C# la classe WindowsFormsApplicationBase: è una nuova feature delle
classi che ereditano da Control del Fx 2.0 e consiste nella capacità di
utilizzare GDI piuttosto che GDI+ per il rendering del testo.
Come mai? Beh, GDI+ ha la peculiarità di avere API estremamente semplici da
utilizzare, ma il buon vecchio GDI offre parecchi vantaggi, per esempio:
Il look dell'applicazione è più consistente con le varie...
La piccola libreria open-source che sto realizzando si è
appena evoluta: grazie al tempo libero che ho avuto durante queste vacanze, sono
riuscito (in ritardo rispetto a quanto avevo previsto, purtroppo) a rilasciare
la versione 1.1 delle Crad's Actions.
Le novità rispetto alla release precedente sono parecchie: intanto un
sensibile refactoring del codice (come?!?! così presto?!? ), che ora è sensibilmente più ordinato e
comprensibile, poi l'aggiunta di nuove proprietà (quali shortcut keys,
tooltip, ecc.ecc...), infine la creazione di un corposo numero di Standard
Actions (es. Cut/Copy/Paste e parecchie altre), numero che è destinato ad
aumentare nei prossimi giorni
Per dimostrare il...
Il titolo non sarà la massima espressione di linguaggio
tecnico, però è un problema che mi sono trovato ad affrontare nel weekend
sviluppando le mie
Actions
Ora, chi le ha scaricate e magari ha avuto modo di guardarne i sorgenti, sa
che si tratta di oggetti che ereditano da Component e che vanno sistemati su una
Windows Form. Mi sono trovato nella necessità di avere, nella mia ActionList, un
riferimento alla Form su cui essa giace....
Quando creiamo CustomControls, spesso
esponiamo proprietà che ritornano collection di items. Visual Studio è
abbastanza furbo da generare un Designer opportuno per creare le istanze degli
oggetti contenuti a design-time, tramite l'UITypeEditor CollectionEditor.
L'abbiamo usata migliaia di volte, si fa click su "Add"
e, detto T il tipo base di dati esposto dalla
collection, automaticamente una nuova istanza di T viene aggiunta ad essa.
Bene, ma se T fosse un tipo astratto? o se volessimo popolare tale
collection anche con tipi derivati da T? come farlo a design time?
Nulla di più semplice! Basta creare un custom UITypeEditor che derivi da CollectionEditor ed...
Dato che mi è stato chiesto da qualcuno in mail, ho pubblicato un breve
tutorial (in inglese, spero non troppo maccheronico ) su come utilizzare le Actions per .NET 2.0.
Per leggerlo basta un click qui!
powered by IMHO 1.3
Chi ha lavorato in Delphi sa quanto siano comode le
actions! Di cosa si tratta? Allora...
Una form, solitamente, permette di compiere la stessa azione tramite più
elementi visuali; pensate ad esempio alla funzione "Grassetto" in un ipotetico editor RTF: magari
possiamo attivarla tramite menu, oppure potremmo utilizzare una comoda toolbar,
o ancora potremmo accedervi tramite un bel context menu. Tutti questi elementi condividono
parecchie proprietà: innanzitutto devono tutti rispondere al click del mouse allo stesso modo, e
questo si può già fare in .NET assegnando lo stesso event handler a tutti gli oggetti per i rispettivi eventi click. Purtoppo ciò...
I ValueTypes sono oggetti un po' particolari: sono allocati nello stack
piuttosto che nel managed-heap e le assegnazioni, se effettuate con reference
type, danno luogo a quel meccanismo che risponde al nome
di boxing/unboxing. Dicevo, regola aurea: *MAI* introdurre metodi
che cambiano lo stato interno di un value type, i risultati potrebbero essere
"strani"
Click sul titolo per continuare a leggere!
Scenario: abbiamo una nostra bella custom collection,
magari che implementa IBindingList, ma non siamo perfettamente soddisfatti di
come il FX ne gestisca il binding: vorremmo infatti scegliere a priori, ad esempio, l'ordine con cui le proprietà vengono
visualizzate quando si effettua un data binding con una DataGridView, o vorremmo poter popolare la nostra custom
collection di Person anche con tipi derivati da Person (normalmente
la DataGridView se la prende parecchio se ci proviamo ).
La soluzione è implementare ITypedList e io, mesi
fa, l'avevo fatto seguendo i dettami di questo articolo su MSDN
Magazine. E' andata sempre bene, finché oggi, facendo alcuni test sulle...
Una delle necessità in cui si può incorrere quando
si sviluppano applicazioni utilizzando custom entities, consiste nel fare in
modo che le proprietà dei nostri oggetti presentino descrizioni significative
una volta in binding, ad esempio, ad una DataGridView.
Personalmente cerco sempre di creare entities con nomi
di proprietà significativi, ma se volessi automaticamente far apparire "Data di
nascita" in luogo di "DataNascita" quando effettuo il binding...
Oggi ho ricevuto un feedback a questo post che mi ha dato da
pensare: ultimamente mi è capitato di leggere commenti molto negativi sul modello DataSet/DataAdapter di ADO.NET, quasi che un bel Domain Model rappresenti la panacea di tutti i mali.
Il mio punto di vista, a questo proposito, è che la distinzione tra bene
e male (o tra Black and White, passatemi questa... è per celebrare il successo del nostro Francesco )
non sia sempre così netta. Chi ha letto Patterns of
Enterprise Application Architecture sa bene che è lo stesso Martin Fowler a sconsigliare il Domain Model in favore di
altri approcci (ad...
Una delle maggiori problematiche per chi ha avuto
qualche esperienza con NHibernate è il fatto che questo
O/RM non gestisce direttamente collection strongly-typed. Ammetto di
non aver cercato moltissimo in giro per la
rete, ma in quei 3 o 4 esempi che ho guardato, le business entities
avevano sempre la forma
public class Master{ // ... more code ... private IList details; public IList Details { get { return details; } }}
Questo tipo di implementazione pone alcune
problematiche: oltre al fatto di essere weakly-typed, può funzionar bene se
viene utilizzata in una pagina ASP.NET, grazie al databinding poco
"interattivo", ma se proviamo a collegarla ad una windows forms perdiamo un
sacco di funzionalità a cui eravamo abituati usando i DataSet (il refresh dei
dati sullo schermo...
In realtà sono molto più temibili i Sabato 18,
soprattutto quando ti viene in mente di aggiornare il tuo sistema al Framework
2.0, approfittando della giornata libera (fino ad oggi ci lavoravo su una
Virtual Machine, poi l'esasperazione per la lentezza ha preso il
sopravvento).
Ho già avuto piccoli sentori che qualcosa non andava quando ho disinstallato
Sql Server 2000 per far posto al 2005: l'uninstall sa solo lui cosa ha
eliminato, fatto sta che il servizio era ancora lì, le cartelle con tutti i
programmi pure e anche le icone sul menu Start resistevano. Consiglio: mi è
stata parecchio utile...
Igor mi ha tolto le parole di bocca (o, per meglio dire, i caratteri
dalla tastiera ) : anche io stavo per scrivere qualcosina a proposito
di un weekend parecchio "object-oriented", trascorso tra C# e NUnit.
Parecchio tempo l'ho passato integrando il ValidationApplicationBlock di Andrea. Che
dire... beh, innanzi tutto che effettivamente questa storia dei custom
attributes, che ha visto nascere un enorme secondo post addirittura all'una di notte passata, mi sta
prendendo fin troppo la mano! Ho modificato un paio di cosine delle classi già
presenti e inserito alcune nuove funzionalità, speriamo che Andrea gradisca, così
magari ve le ritrovate in una prossima release!
In...
In un post precedente ho iniziato un discorso su come
utilizzare le potenzialità dei custom attributes per validare le nostre entity.
Una volta capito il meccanismo, è estrememente semplice implementare tutta una
serie di classi che permettano le più disparate tipologie di validazioni, magari
anche combinandole tra di loro.
Il nostro nuovo ErrorMessageAttribute
Ma se la validazione fallisce come dobbiamo comportarci? Beh, l'ideale a
questo punto sarebbe sollevare un'eccezione, magari potendo fornire un
messaggio d'errore specifico per il membro che non è stato correttamente
valorizzato. Siccome ci stiamo appassionando tantissimo alla programmazione
dichiarativa , realizziamo un bell'attributo simile a questo
(semplicissimo) che...
Magari per tanti di voi sarà già tutto noto, ma lo scrivo
lo stesso per chi, come me, non ne era al corrente.
Sul sito di MSDN, e più precisamente a questo indirizzo, sono presenti diversi template da
utilizzare per le nostre web-apps. Alcuni sono veramente carini e,
cosa importante anche per "fini didattici", sono
tutti realizzati sfruttando parecchie delle novità di ASP.NET 2.0, quali Master
Pages, GridView, Themes, ecc.ecc.
Buon download
powered by IMHO 1.3
Ieri sera, mentre riscrivevo alcune delle baseclass
del mio domain model sfruttando alcune delle chicche del FX 2.0
(leggi BindingList<T>, che mi fa risparmiare un sacco di codice), mi sono
chiesto se non fosse possibile costruire una struttura per validare
automaticamente le mie business entities, visto che il codice da scrivere è
spesso ripetitivo: questa proprietà non può essere nulla, quest'altra deve
essere maggiore di zero, e così via.
In pratica, ciò che si vuol fare è di integrare i metadati delle nostre classi decorandole
con Attributi personalizzati che poi possiamo recuperare a
runtime via reflection. Supponiamo, ad esempio, di voler realizzare...
Scaricando uno qualsiasi dei Visual Studio Express Edition e registrandosi, si
ottiene gratuitamente tutta una serie di download aggiuntivi, alcune icone,
immagini e i libri (ovviamente in formato PDF) della serie Build a
program NOW!
Ho
avuto l'occasione di dare un'occhiata a questi ultimi qualche giorno fa, dopo
che mio padre mi aveva chiesto una guida semplice per realizzare qualche piccola
applicazione su windows. Che dire... mi hanno sorpreso, veramente un ottimo
lavoro: coprono un'ampia fascia di argomenti, che vanno dal making-up delle
interfacce alla validazione dell'input dell'utente, o dalla gestione dati
tramite un RDBMS fino ai WebServices, spiegando...