Che nomi esotici che ho tirato fuori dal cilindro, eh? Con questo post, crederò che farò felice il mio omonimo, che sognava questa feature da qualche sera. Ovunque tu sia adesso, leggi e dimmi che ne pensi, appena puoi.
Com'era fino ieri?
Una delle caratteristiche di Happy Sign è quella di poter salvare da qualche parte tutti i dati che gli servono (straordinario!). Con il termine "dati" intendo categorie, firme di ogni tipo e le impostazioni dell'utente (colori in primo luogo). Nelle prime fasi di sviluppo, Happy Sign salvava solamente su disco nella directory:
C:\Documents and Settings\<username>\Local Settings\Application Data\VivendoByte\HappySignData
Il formato dei files era una banale serializzazione in chiaro delle parti di domain model interessato. Quindi, nella directory indicata sopra avevo i files Categories.xml, NormalSignatures.xml e così via.
Com'è oggi?
Ho voluto migliorare questa cosa, perchè usare un banale XML in chiaro non è che mi ispirasse più di tanto. Ne parlavo con qualcuno durante le nostre sessioni di brainstorming al workshop. Volevo salvare in formato binario, o criptato, o in qualche altro modo. Ragionando con Igor l'altro, abbiamo pensato di disaccoppiare la logica di persistenza in un layer a parte. No, NHibernate questa volta non c'entra, perchè voglio evitare di salvare su database, anche perchè in un'applicazione di questo tipo è poco adatto. Però in un futuro forse sì.
Quello che ho fatto è creare un assembly HSPersister che raccoglie, standardizza ed uniforma tutta la logica necessaria al runtime di Happy Sign per caricare e salvare i dati che gli competono. Tutta è basato su un'interfaccia, IHSPersister, che le classi che vogliono fungere da motore di persistenza di Happy Sign devono implementare. L'interfaccia IHSPersister è definita come segue:
public interface IHSPersister
{
void SaveSettings(acclExplorerBar ExplorerBar);
void SaveAllData();
void SaveCategories();
void SaveNormalSignature();
void SaveDynamicSignature();
void LoadAllData();
void LoadCategories();
void LoadNormalSignature();
void LoadDynamicSignature();
}
Il codice qui sopra è ancora in work-in-progress, per cui non fate troppo caso a quell'oggetto acclExplorerBar. Quello che mi interessa far notare è, in fin dei conti, che tutti gli altri componenti di Happy Sign sfruttano la persistenza attraverso un riferimento all'interfaccia cui sopra, e quindi essere completamente trasparenti rispetto a come avviene effettivamente la persistenza dei dati. Probabilmente verranno aggiunto dei metodi prima del rilascio finale, ci ragioneremo su.
Concludo. Nel file Program.cs istanzio la classe concreta a cui delegherò la persistenza, in questo modo:
// The concrete persister class must be read from a config files
IHSPersister pers = new HSPlainXMLPersister(_core);
La classe HSPlainXMLPersister è una classe che implementa quindi IHSPersister, e che salva in formato XML in chiaro. Ho creato un nuovo persister (bello 'sto nome!) chiamato HSCryptedXMLPersister che fa la stessa cosa ma in formato binario. Potremmo creare HSFlatFilePersister, per esempio, o HSSqlServerPersister, o HSOnTheMoonPersister. Chi se ne importa?
Va bene che Happy Sign è un software divertente, ma non è detto che non possa essere un po' flessibile ed elegante!
Discussioni o ragionamenti su : this thread on CodePlex