C# - Alkalmazások konfigurációs lehetőségei

forráskód letöltése
A .NET számtalan előnyt és lehetőséget nyújt elődeihez képest az alkalmazásaink konfigurálásában is. Elfelejthetjük a bonyolult állománykezelést és állományfrissítést, hiszen a .NET beépített módon támogatja ezeket. Csupán annyit kell tennünk, hogy megadjuk a konfigurációs állományokba mentendő adatok körét, és meghívjuk az előre gyártott metódusok közül azt, amelyik az adott szituációban a legalkalmasabb. Cikkünkben ezekkel a lehetőségekkel ismerkedhetünk meg részleteiben.
A múltban készített alkalmazások konfigurációs adatait főként .INI állományokban tároltuk, majd kicsit később igénybe vehettük erre a Rendszerleíró adatbázist is. A .NET azonban ezek helyett inkább az adatok XML állományba történő szerializációját javasolja és támogatja. A mellékelt példában kétféle konfigurációs lehetőséget mutatunk be, melyek közül az első gyökereiben kicsit a régi típusú módszerhez közelít, míg a második alapvetően az új szellemiség jegyében született.
Konfigurációs adatok a Registry-ben
Az alkalmazások AssemblyInfo.cs forrásállományaiban van lehetőségünk különböző, az alkalmazásra vonatkozó információkat megadni, melyek a fordításkor bekerülnek a generálódó bináris kódba, illetve programból elérhetjük ezeket.
A mellékelt példában három információt adunk meg ebben a formában.
[assembly: AssemblyCompany("Animare Software")]
[assembly: AssemblyProduct("Sample Application")]
[assembly: AssemblyVersion("1.0.0.0")]
Megadtuk a cég nevét, a létrehozott program nevét és a verziószámot. Ezeket az információkat a Form1 osztályunk egy-egy property-je reprezentálja. A Form-ra helyezett TabControl első füle alatt le is kérdezhetjük ezeket.
textBox1.Text = CompanyName;
textBox2.Text = ProductName;
textBox3.Text = ProductVersion;
Ezek az információk szükségesek ahhoz, hogy az alkalmazás tetszőleges adatait a Registry alkalmazáshoz tartozó kulcsa alatt egyszerűen, vagyis ne a hagyományos módon tároljuk el. Ez azt jelenti, hogy ha ezeket megadtuk, akkor az Application osztály UserAppDataRegistry property-je segítségével közvetlenül elérhetjük a következő kulcsot:
CurrentUser\Software\ CompanyName\ ProductName\ ProductVersion
A kulcs automatikusan létrejön, bejegyzések helyezhetők el alatta. A property deklarációja a következőképpen fest:
UserAppDataRegistry
Osztály:
public static RegistryKey UserAppDataRegistry {get;}
A property tehát RegistryKey típusú, vagyis használhatjuk a SetValue és GetValue metódusokat az adatok írására és olvasására.
A property használatára a TabControl harmadik füle alatt láthatunk példát. A szövegmezőben megadott karakterláncot a fent említett kulcs alatt helyezhetjük el a MyString változóban.
Application.UserAppDataRegistry.SetValue("MyString",textBox4.Text);
Az alkalmazás következő indulásakor ezt a szöveget tudjuk kiolvasni a bejegyzésből.
textBox4.Text = Application.UserAppDataRegistry.GetValue("MyString").ToString();
A Rendszerleíró adatbázist megtekintve látható a bejegyzés a megfelelő helyen.
Saját konfigurációs XML generálása
A második típusú konfigurációs technika felhasználásával egy konfigurációs állományban helyezzük el az alkalmazás dialógusablakának pozíciójára, valamint a TabControl második füle alatt található RichTextBox kontrol aktuális háttérszínére vonatkozó információkat. A konfigurációs adatfolyam elkészítésében a ConfigClass osztályunk lesz segítségünkre, melynek két property-je reprezentálja a két eltárolandó adatot. Az egyik property típusa értelemszerűen Point, míg a második típusa SystemColors.
Az osztály Save metódusában végezzük el az alkalmazás két adatának szerializációját. A konfigurációs állomány neve Settings.config lesz, és az alkalmazás mappájában lesz megtalálható.
A műveletet az XmlSerializer osztály végzi el, ezért elkészítünk belőle egy példányt.
s = new XmlSerializer(typeof(ConfigClass));
Az osztály konstruktorában az osztályt kell megadni. Szükség van egy StreamWriter objektumra is, mely a Settings.config állományba írja az adatokat. A mentés pedig az XmlSerializer osztály Serialize metódusával történik.
sw = new StreamWriter(Application.StartupPath + @"\Settings.config",false);
s.Serialize(sw, this);
Mindezt akkor hívjuk meg, ha az osztály settingsChanged változója TRUE értéket vesz fel. A változó értéke a property-k értékének módosításakor változik meg.
A Load metódusban az alkalmazás indulásakor olvassuk be az adatokat a konfigurációs állományból. Itt is szükség lesz egy XmlSerializer objektumra.
s = new XmlSerializer(typeof(ConfigClass));
Amennyiben a konfigurációs állomány létezik, akkor megnyitjuk olvasásra.
if (File.Exists(Application.StartupPath + @"\Settings.config"))
{
  FileInfo fi = new FileInfo(Application.StartupPath + @"\Settings.config");
  fs = fi.OpenRead();
Végül az XmlSerializer objektum Deserialize metódusával beolvassuk az adatokat.
ConfigClass settings = (ConfigClass)s.Deserialize(fs);
backColor = settings.BackColor;
formLocation = settings.FormLocation;
A szerializálandó alkalmazásban példányosítjuk a ConfigClass osztályt.
private ConfigClass settings = new ConfigClass();
Az objektum úgy kap értékeket, hogy a Form pozíciójának módosulásakor értéket kap a FormLocation property.
private void this_LocationChanged(object sender, EventArgs e)
{
  settings.FormLocation = Location;
}
Valamint a RichTextBox kontrol háttérszínének megváltozásakor a BackColor property.
settings.BackColor = richTextBox1.BackColor.ToArgb();
Az alkalmazás bezárásakor elmentjük a változásokat az osztályunk Save metódusával.
settings.Save();
Az alkalmazás indulásakor pedig beolvassuk az adatokat, majd értékül adjuk azokat a Form-nak, illetve a RichTextBox kontrolnak.
if (settings.Load())
{
  richTextBox1.BackColor = Color.FromArgb(settings.BackColor);
  Location = settings.FormLocation;
  ...
A szerializáció eredményeképpen a következő adathalmaz került a konfigurációs állományba.
<?xml version="1.0" encoding="utf-8"?>
<ConfigClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <BackColor>-32640</BackColor>
  <FormLocation>
    <X>209</X>
    <Y>134</Y>
  </FormLocation>
</ConfigClass>