Σήμερα έφαγα λίγο χρόνο με τις νέες κλάσεις που έχει το .ΝΕΤ 2.0 για τη διαχείριση των configuration files. To μεγάλο νέο είναι ότι πλέον μπορείς να γράψεις σε ένα configuration αρχείο. Το documentation είναι imho κάκιστο, αλλά τελικά έβγαλα άκρη στο τι ήθελα να κάνω και μετά καθάρισε ο reflector
. Επειδή το αποτέλεσμα μπορεί να φανεί χρήσιμο και σ'άλλους είπα να το βάλω στο dotNetZone.
Το πρόγραμμα που φτιάχνω ξεκινάει διαβάζοντας μια σειρά από αρχεία mdb από τα οποία αντλεί δεδομένα. ¨Ηθελα λοιπόν να έχω το ποια είναι αυτά τα αρχεία μέσα στο .config της εφαρμογής σε μια μορφή όπως η εξής:
<
configuration>
...
<metadataFilesInfo>
<metadataFiles>
<add filename="NUNIT1.MDB" description="NUnint Test MDB 1" options="Normal"/>
<add filename="NUNIT2.MDB" description="NUnint Test MDB 2" options="Normal"/>
<add filename="NUNIT3.MDB" description="NUnint Test MDB 3" options="IgnoreErrors"/>
<add filename="NUNIT4.MDB" description="NUnint Test MDB 4" />
</metadataFiles>
...
</metadataFilesInfo>
<configuration>
To metadataFilesInfo είναι αυτό που ονομάζεται Section Group, ενώ το metadataFiles είναι ένα section. Ένα section επιτρέπεται να εμφανίζεται μόνο μία φορά μέσα στο αρχείο. Μπορεί να προσδιορίζει settings σαν attributes του xml element. Όταν όμως χρειάζεται μια λίστα από εγγραφές όμοιες μεταξύ τους εκεί πρέπει να παίξουμε ένα επίπεδο πιο μέσα με το add ενώ για να διαβάσουμε τις εγγραφές μέσω μιας κλάσης πρέπει να ακολουθήσουμε την τεχνική που περιγράφω παρακάτω.
Αυτό που χρειάζεται είναι να φτιαχτεί (με τον .ΝΕΤ 2.0 τρόπο) μια κλάση για το custom section metadataFiles. Αυτή η κλάση θα έχει για member της ένα collection κάποιου τύπου μέσω του οποίου γίνονται προσπελάσιμες οι εγγραφές. In principle ακούγεται απλό. Ένας κώδικας που διαβάζει αλλά και γράφει το configuration file είναι ο εξής:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSectionGroup csg = config.SectionGroups["metadataFilesInfo"];
MetadataFilesSection mfs = csg.Sections["metadataFiles"] as MetadataFilesSection;
System.Collections.IEnumerator enumerator = mfs.MetadataFiles.GetEnumerator();
while (enumerator.MoveNext())
{
MetadataFileInfo info = (MetadataFileInfo)enumerator.Current;
Console.WriteLine(info.FileName + " Description: " + info.Description + " Options: " + info.Options);
}
// Make some change
enumerator.Reset();
enumerator.MoveNext();
MetadataFileInfo mfi = (MetadataFileInfo)enumerator.Current;
mfi.Options = "Optional";
config.Save();
Ο κώδικας νομίζω είναι σχετικά απλός. MetadataFileInfo είναι η κλάση που αντιστοιχεί σε κάθε γραμμή του configuration file, ενώ MetadataFilesSection η κλάση που αντιστοιχεί στο section.
Ο κώδικας για το πώς πρέπει να φτιαχτούν αυτές οι κλάσεις είναι attached στο post, καθώς και το app.config με τις δηλώσεις του section group και του section.
Ελπίζω να φανεί χρήσιμο ![Smile [:)]](/cs/emoticons/emotion-1.gif)
Brute Force
The fact that the program works is irrelevant.