Programátor píšící cokoli většího než je konzolová aplikace na pár řádečků dříve nebo později narazí na problém - kam ukládat konfigurační údaje, které aplikace pro svůj běh potřebuje. Způsobů je několik a každý z nich má své pro a proti. Pojďme se podívat na ty nejznámější z nich.
INI soubory
Už od dřevních dob používaly programy k uložení konfigurace tzv. ini soubory. Byly to textové soubory, typicky uložené v adresáři aplikace a směly obsahovat jednu či více sekcí a v každé sekci pak parametry. Čili, mohlo to vypadat nějak takto:
[Config]
server=localhost
user=sa
database=master
[Export]
format=txt
Savepath=D:
Jako hlavní výhodu ini souborů bych viděl jejich jednoduchost, jako hlavní nevýhodu vnímám to, že .NET je nepodporuje nativně. Je třeba použít staré triky a naimportovat si funkce z kernel32.dll:
Private Declare Ansi Function GetPrivateProfileString _
Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As System.Text.StringBuilder, _
ByVal nSize As Integer, ByVal lpFileName As String) _
As Integer
Nic moc, co?
Registry Windows
Ukládání informací do registrů je další dobrý a hojně používaný způsob zápisu konfigurace. Tento způsob má v .NET frameworku poměrně robustní podporu, takže můžete s pomocí Microsoft.Win32 psát něco ve smyslu:
regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\NODE\NODE\NODE", False)
umisteni = regKey.GetValue("KEY")
a obdobně pro ukládání. Ve prospěch používání registrů hovoří rovněž fakt, že do nich lze zapisovat již při instalaci (alespoň neznám žádný pokročilý instalátor, který by toto neuměl) a že pomocí nástroje regedit, který je k dispozici přímo v systému lze s registry manipulovat. Systém rovněž registry umí zálohovat a tak zazálohuje i Vaše nastavení, pokud jej registry obsahují.
Co mě od registru odrazuje je jeho chaotičnost. Jistě, systémové věci jsou tam kde mají být, ale aplikace třetích stran obvykle zapisují do registru stylem “každý pes jiná ves”.
VB.NET a jeho záložka Settings
Pokud pracujete (jako já) ve VB.NET, je k dispozici elegantní způsob ukládání konfigurace pomocí předpřipravených nástrojů, a to ve formě My.Settings. Systém je klikací, vygenerovaný kód obsahuje typovou kontrolu a interně je konfigurace uložena v XML souboru kdesi v uživatelském profilu. XML může vypadat nějak takto:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<Program.My.MySettings>
<setting name="LastUpdateCheck" serializeAs="String">
<value>08/09/2009 14:30:53</value>
</setting>
<setting name="Verze" serializeAs="String">
<value>0.1</value>
</setting>
</Pracant.My.MySettings>
</userSettings>
</configuration>
Sympatické na tomto řešení je, že všechen kód pro ukládání a načítání konfigurace se generuje sám, uživatel pouze nakliká název a typ proměnné. Co mě na tomto způsobu ukládání hodnot odrazuje jsou dvě věci:
- Pokud se změní číslo verze assembly nebo jí dáte strong name, konfigurace se automaticky zahodí. Lze sice konfiguraci upgradovat z nižší verze, nicméně není to až tak triviální.
- Co je horší, program si ukládá soubory user.config do složek s kryptickými jmény (soubor výše mám například uložen ve složce "c:\Users\[profil]\AppData\Local\[firma]\[program].exe_StrongName_zygbcdzgwep1celxzqmkzrjfy20v3pkk\0.1.0.0" a neznám způsob, jak tuto cestu programově zjistit. To mimo jiné znamená, že nevím, jak přečíst nastavení cizí aplikace, což by se v reále mnohokrát hodilo a což by například v případě použití registrů bylo naprosto triviální.
Ukládání konfigurace do nějaké databáze
Při ukládání konfigurace do databáze musí programátor typicky napsat nějaký kód a vymyslet způsob, jak budou hodnoty v databázi uloženy. Mezi největší přínosy tohoto řešení patří fakt, že konfiguraci v databázi lze sdílet mezi více uživateli programu – což při použití předchozích metod je někdy složité a jindy zcela nemožné.
Mezi největší problémy patří to, že konfigurace z databáze je přístupná až po připojení k databázi. Pokud databáze ještě k dispozici není (například při startu programu nebo při selhání), konfiguraci nemusí jít načíst nebo uložit, a to může být problém.
Něco vlastního
Čas od času bývá k vidění rovněž nějaký vlastní systém – setkal jsem se například z projektem, který ukládal konfiguraci do XML souborů v adresáři aplikace. Vzhledem k tomu, že .NET obsahuje řadu nástrojů pro XML nemusí být tento způsob vůbec špatný. Výhodou je tedy jeho jednoduchost – co může být jednoduššího než:
Dim oXS As XmlSerializer = New XmlSerializer(obj.GetType)
Dim oStmW As StreamWriter
oStmW = New StreamWriter("konfigurace.xml")
oXS.Serialize(oStmW, obj)
oStmW.Close()
Na druhou stranu jako největší nevýhodu vnímám to, že tento způsob práce s konfigurací není nijak standardizován.
A jak řešíte ukládání konfigurace Vy, milí čtenáři?