8
Permite utilizarea setarilor de configurare in o modalitate intuitiva, orientata obiect. Permite citirea si scrierea setarilor fara a depinde de Windows registry. Astfel aplicatiile voastre vor fi mai administrator-friendly si, in plus, vor fi mai usor portate pe alte sisteme de operare (ce nu folosesc registry).
Toate obiectele pe care le vom folosii pt realizarea de configurari sunt in clasa System.Configuration Clasele principale din acest namespace sunt Configuration si ConfigurarionManager. Obiectele de tip Configuration sunt create folosind metode din ConfigurationManager
Configuration cs = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Configuration cs = ConfigurationManager.OpenMachineConfiguration(); ExeConfigurationFileMap myMap = new ExeConfigurationFileMap(); myMap.ExeConfigFileName = @”DBConnectrionStringDemo.exe.config”; Configuration cs = ConfigurationManager.OpenMappedExeConfiguration(myMap, ConfigurationUserLevel.None); Configuration cs = ConfigurationManager.OpenMappedMachineConfiguration(myMap);
Metodele de mai sus indeplinesc acelasi scop: deschid un fisier de configurare si returneaza valorile continute de acelasi in un obiect Configuration. Metoda 1 si 3 deschid fisiere de configurare specifice aplicatiei iar 2 si 4 specifice calculatorului pe care ruleaza aplicatie. Enumerarea ConfigurationUserLevel contine urmatoarele valori: None: returneaza un obiect Configuration care se aplica la toti utilizatorii PerUserRoaming: returneaza un obiect Configuration, roaming, pentru pentru userul actual. PerUserRoamingAndLocal: returneaza un obiect Configuration, local, pentru userul actual. Prin obiectul ExeConfigurationFileMap putem folosii alt fisier de configurare (altul decat cel predefinit: App.config)
OBS: In momentul in care se acceseza un ExeConfigurationFileMap trebuie ca utilizatorul apelent sa aiba drepturi de citire pe acel fisier si evident trebuie ca acel fisier sa existe. Runtime-ul nu va arunca exceptie daca acel fisier nu exista, deci este recomandat sa verificati inainte de asignare.
Setarile obisnuite (common settings) determina cum ruleaza o aplicatie. supportedRuntime: specifica ce .NET Framework este necesar pentru rularea aplicatiei:
<startup> <supportedRuntime version=“v1.1.4322”>
Daca pe masina este un .NET framework diferit de cel pe care sa construit aplicatie, si nu ati specificat supportedRuntime, aplicatia va pornii. Daca ati specificat supportedRuntime e rau :)
developmentMode: permite verificare daca un assembly poate fi folosit de mai multe aplicatii, fara a-l instala in GAC (global assembly cache). Suplimentar trebuie adaugata o variabila de mediu DEVPATH, care specifica unde se afla assembly-ul.
<developmentMode developerInstallation=“true”/>
codeBase: permite specificare locatiei si versiunii unui assembly astfel incat dupa ce se incarca runtime-ul acel assembly va fi folosit de la locatie specificata.
<dependantAssembly>
In un fisier de configurare pot exista 2 sectiuni: appSettings si connectionStrings. In appSettings puteti stoca setari generice de aplicatii in timp ce connectionStrings este dedicat stocarii de connection strings pentru baze de date.
Pentru a accesa appSettings vom folosii obiectul ConfigurationManager: NameValueColletion AllAppSettings = ConfigurationManager.AppSettings; Console.WriteLine(AllAppSettings[“message”]); Console.WriteLine(AllAppSettings[0]);
Deoarece NameValueCollection implementeaza interfata IEnumerable putem folosii un enumerator (si deci constructie foreach) pentru a parcurge toate appSettings.
Deoarece multe programe folosesc conectari la baze de date, dezvolatatorii .net framework au decis sa introduca un sistem dedicat de stocare si citire a connection string-urilor necesare conectarii la baze de date. Puteti accesa connectionStrings exact ca appSettings. Diferenta este ca in loc de un NameValueCollection connection string-urile vor fi stocate in un ConnectionStringSettingCollections, ce contine obiecte de tip ConnectionStringSettings.
Odata ce avem obiectul ConnectionStringSettings il putem folosii pentru a realiza o conexiune la o baza de date:
In general stim ce connection string avem nevoie, iterarea prin ele devenind inutila. ConnectionStringSettings mySettings = ConfigurationManager.ConnectionStrings[“Adventu reWorksString”]; ConnectionStringSettings mySettings = ConfigurationManager.ConnectionStrings[0];
In aplicatii ASP.NET nu se recomanda folosirea ConfigurationManager. Exista solutii dedicate: WebConfigurationManager. Diferentele intre ConfigurationManager si WebConfigurationManager sunt: Metodei GetSection din ConfigurationManager ii corespunde metoda GetWebApplicationSection din WebConfigurationManager Metodei OpenMappedExeConfiguration ii corespunde OpenMappedWebConfiguration Metodei OpenExeConfiguration ii corespunde OpenWebConfiguration
Application settings sunt configurari specifice aplicatiei. Sunt 2 modalitati in care putem crea application settings: una complicata: scriem de mana fisierul de configurare si clasa necesara parsarii una simpla: lasam VS2005 sa creez fisierul si clasa
Un ultim mecanism pe care il putem folosii pentru salvarea application settings este folosirea clasei ApplicationSettingsBase. ApplicationSettingsBase este o colectie Key/Value, unde referentierea se face dupa o cheie. Tot ce trebuie sa facem pentru a folosii ApplicationSettingsBase este sa mostenim ApplicationSettingsBase si sa “decoram” fiecare proprietate fie cu UserScopedSettings, fie cu ApplicationScopedSettings
Principalele motive pentru crearea unui installer pot fi: Dau aplicatiei un “look” profesional Simplifica munca utilizatorului. Cu cat un produs este mai greu de instalat cu atat utilizatorul il va folosii mai putin. Permit specificarea de setari (adrese de servere, baze de date) si crearea de scurtari pe desktop, chei in registry, etc. Reprezinta un mecanism usor de a sterge aplicatia.
Clasa folosita pentru a crea un installer se numeste Installer. Pentru a folosii clasa Installer trebuie urmati urmatorii pasi: Mosteniti clasa Installer Implementati metodele Install, Commit, Rollback si Uninstall. Adaugati atributul RunInstallerAttribute cu valoarea true la clasa derivata. Puneti clasa derivata in assembly-ul aplicatiei pe care doriti sa o instalati. Invocati install-erle. Puteti folosii InstallUtil.exe (ca la servicii)
Cand porneste instalarea este invocata metoda Install. Daca nu apare nici o eroare este invocata metoda Commit la finalul instalarii. Daca apare vreo eroare este invocata metoda Rollback. Daca doriti stergerea aplicatiei este invocata metoda Uninstall. Pentru a facilita utilizarea metodei Commit putem folosii 2 evenimente: Commited si Commit
IDictionary mySavedState = new Hashtable(); Console.WriteLine( "" );
try { // Set the commandline argument array for 'logfile'. string[] commandLineOptions = new string[ 1 ] {"/LogFile=example.log"}; // Create an object of the 'AssemblyInstaller' class. AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller( "MyAssembly.exe" , commandLineOptions ); myAssemblyInstaller.UseNewContext = true; // Install the 'MyAssembly' assembly. myAssemblyInstaller.Install( mySavedState ); // Commit the 'MyAssembly' assembly. myAssemblyInstaller.Commit( mySavedState ); } catch (ArgumentException) { } catch (Exception e) { Console.WriteLine( e.Message ); }
.NET Configuration Tool permite modificarea setarilor unei assembly folosind un mediu vizual. Ruleaza ca un snap-in in Microsoft Management Console. Permite ajustarea potiticilor de securitate de acces la cod Permite ajustarea serviciilor de remoting.
Deschiderea snap-in-ului: %SystemRoot%\Microsoft.NET\Framework\versi onNumber\Mscorcfg.msc Aveti 5 optiuni:
Manage the Assembly Code Manage Configured Assemblies Configure Code Access Policy Adjust Remoting Services Manage Individual Applications
Un fisier de configuratie poate contine mai multe sectiuni de configurari (Configuration Section) Pentru citirea unei sectiuni din un fisier de configurari se poate folosii metode GetSection din ConfigurationManager ConfigurationManager. GetSection(“MyFirstSection/DataValues”) as ValuesHandler Valoare returnata este de tip obiect deci va trebuii facuta o operatie de cast in o clasa ce implementeaza IConfigurationSectionHandler
Salvarea sectiuniilor de configurare este foarte simpla: se foloseste metoda Save sau SaveAs din o instanta a clasei Configuration. Save adauga sectiuni de configurari adugate in instanta clasei, sterge pe cele sterse si le modifica pe cele modificate. Save salveaza in fisierul ApplicationName.exe.config in timp ce la SaveAs se poate specifica numele fisierului. OBS: Proprietatea ForceSave din proprietatea SectionInformation din obiectul ConfigurationSection trebuie setata true, altfel orice modificari vor fi ignorate in momenul salvarii configurarilor.
Atunci cand doriti un grad mai mare de customizare in fisierele de configurare veti construi configuration sections. Pentru a putea intelege o astfel de configuration section trebuie sa construiti o clasa ce implementeaza IConfigurationSectionHandler In .NET 2.0 IConfigurationSectionHandler a fost inlocuit de ConfigurationSection. Cele 2 au functionalitati similare dar este de preferat folosirea celei de a doua.
Primul pas in folosirea unei sectiuni proprii este sa creati un obiect SectionGroup in sectiune ConfigurationSection din fisierul vostru de configurare. Obiectele ConfigurationSection sunt stocate in ConfigurationSectionCollection din un obiect Configuration. Numele trebuie sa fie complet, inclusiv numele assembly-ului.
<sectionGroup name=“MyFirstSection type=“DBConnectionStringDemo.MyFirstSectionHandler, DBConnectionStringDemo” />
Puteti accesa sectiunile si din clasa Configuration: Configuration config =ConfigurationManager.OpenExeConfiguration(Con figurationUserLevel.None); ConfigurationSectionGroupCollection DemoGroups = config.SectionGroups; foreach (String groupName in DemoGroup.Keys) Console.WriteLine(groupName);
In continuare trebuie creata sectiune propriuzisa
Acum trebuie implementat IConfigurationSectionHandler. Are o singura metoda: Create.
Construim si o clasa ValuesHandler. Tot ce face este sa ofere o modalitate mai comoda de extragere a datelor din Hashtable. in final: ValuesHandler vals = ConfigurationManager.GetSection(“MyFirst Section/DemoValues”) as ValuesHandler.
Alta solutie:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) ConfigHandler Chapter9Section = new ConfigHandler(); //accesam datele prin Chapter9Section.FirstName sau LastName config.Sections.Clear(); config.Sections.Add(“Chapter9Section”,Chapter9Section); config.Save();
O alta interfata folosita prin System.Configuration este IApplicationSettingsProvider. E folosita (printre altele) de ApplicatioSettingsBase. Contine 3 metode: GetPreviousVersion: intoarce valoarea setarilor pentru versiuni anterioare ale aplicatiei Reset: reseteaza setarile asociate aplicatiei la forma initiala Upgrade: Indica faptul ca aplicatia a fost actualizata si ofera posibilitatea actualizarii setarilor pentru compatibilitate cu aplicatia noua.