Cum se adaugă setările personalizate de configurare pentru o aplicație .NET (ASP)

De la lansare, aplicațiile și componentele ASP.NET au căutat fișierul web.config pentru a încărca setările de care au nevoie pentru a funcționa. Cu toate acestea, adăugarea de setări personalizate pentru a adăuga flexibilitate și robustețe la o aplicație sau la o componentă nu este la fel de directă pe cât ar dori majoritatea. Acest articol vă învață cum să scrieți clasele necesare pentru a gestiona elementele de configurare XML și să utilizați setările pe care le conțin în codul dvs..

Tutorial publicat

La fiecare câteva săptămâni, revizuim câteva postări preferate ale cititorului nostru de-a lungul istoriei site-ului. Acest tutorial a fost publicat pentru prima oară în noiembrie 2012.

.NET Framework oferă o gamă largă de setări care pot fi configurate în cadrul web.config pentru a modifica comportamentul uneia sau mai multor componente încorporate în cadrul aplicației. Pentru unii dezvoltatori, lipirea doar a setărilor furnizate de .NET Framework este suficientă. Mulți dezvoltatori găsesc însă că trebuie să controleze o colecție mai largă de setări - fie pentru componente (scrise de ei înșiși sau o parte terță), fie pur și simplu un set de valori pe care aceștia le folosesc în întreaga aplicație.

Fișierul web.config vă permite să setați setările personalizate cu element, dar nu permite altceva decât perechi simple cheie / valoare. Următorul element XML este un exemplu de setare conținută în :

Setările cheie / valoare pot fi utile în multe situații, dar setările nu sunt suficient de flexibile pentru componente sau setări robuste sau complexe.

Din fericire, Microsoft permite dezvoltatorilor să scrie clase care să adauge acces programatic la setările personalizate de configurare conținute în web.config.


Secțiunea Configurare

Setările din cadrul web.config sunt clasificate în secțiuni de configurare. De exemplu, setările conținute în secțiunea se referă la setările ASP.NET pentru aplicația dvs. Puteți modifica schema de autentificare a aplicației dvs., precum și puteți adăuga sau elimina dispozitivele de tratare HTTP pentru a efectua anumite funcții pentru anumite tipuri de fișiere. vă permite să controlați multe dintre setările IIS7 fără a avea acces direct la IIS7.

O secțiune de configurare este necesară pentru toate setările care nu sunt conținute în element. Deci este o idee bună să proiectați structura XML a setărilor de configurare înainte de a scrie orice cod.

Configurația folosită ca exemplu în acest tutorial este pentru o componentă care recuperează feedurile RSS sau Atom. Nu face nici o analiză, deoarece aceasta depășește scopul acestui tutorial. În loc de a codifica greu lista de feed-uri pentru a fi preluate, componenta se uită la configurația sa pentru a conține numele și adresele URL ale feed-urilor pentru a fi preluate. Componenta se numește FeedRetriever, iar structura XML dorită a configurației sale arată astfel:

      

element definește prin secțiunea de configurare. Ca regulă generală, o secțiune de configurare ar trebui să împărtășească numele componentei pentru care a fost proiectată. elemente doar copil este element. Gândiți-vă la acest element ca o colecție de feed-uri deoarece conține mai multe elemente (gândiți-vă la metoda Add () pe care majoritatea obiectelor de colecție au). Alegerea folosirii unui element numit "add" poate părea ciudat la început, dar elementul este utilizat în majoritatea secțiunilor de configurație încorporate. Deci, folosindu-l aici urmează pur și simplu practicile de proiectare prezentate de Microsoft.

Aceste elementele folosesc atributele nume, url și cache pentru a seta anumite setări pentru fiecare feed. Firește, atributele de nume și url sunt necesare, dar atributul cache nu este și ar trebui să fie implicit ca fiind adevărat.

Configurația de mai sus este simplă. element ar putea fi modificat pentru a conține un alt copil, numit , să conțină setări care s-ar aplica tuturor feedurilor. elementele ar putea folosi, de asemenea, atribute suplimentare, cum ar fi cacheTime și requestFrequency, pentru a controla cât timp un feed este stocat în cache și cât de des este solicitat de la gazda de la distanță. Singura limită a extensibilității și configurabilității este imaginația ta.


Scrierea manualului de configurare

După proiectarea structurii XML, următorul pas este să scrieți un handler de configurare pentru a procesa setările definite în XML. Handlerul este în primul rând o clasă care moștenește din System.Configuration.ConfigurationSection, dar încorporează și utilizarea altor clase - cum ar fi clasele care derivă din System.Configuration.ConfigurationElement și System.Configuration.ConfigurationElementCollection.

Clasele bazate pe ConfigurationElement reprezintă elemente individuale; este blocul de construcție al unei secțiuni de configurație. Tipurile care derivă din ConfigurationElementCollection reprezintă pur și simplu elemente care conțin mai mult de un tip de element. Din configurația listată mai sus, elementul este reprezentat de o clasă care derivă din ConfigurationElementCollection și elementele sunt reprezentate de o clasă bazată pe ConfigurationElement.


Reprezentarea Element

Veți începe cu element reprezentând-o cu o clasă numită FeedElement (derivată din ConfigurationElement). Această clasă și clasele viitoare legate de configurare se află în spațiul de nume FeedRetriever.Configuration.

Fiecare obiect ConfigurationElement funcționează ca indexer pentru colecția sa internă de valori ale proprietăților. Este această colecție internă, împreună cu atributele .NET, care vă permite să cartografiați Elementele elementului proprietăților clasei FeedElement.

Următorul cod este codul complet pentru clasa FeedElement:

public class FeedElement: ConfigurationElement [ConfigurationProperty ("nume", IsKey = true, IsRequired = true)] șir public nume get return (string);  setați this ["name"] = value;  [ConfigurationProperty ("url", IsRequired = true, DefaultValue = "http: // localhost")] [RegexStringValidator (@ https?: // \ S + acest [ "url"];  set this ["url"] = valoare;  [ConfigurationProperty ("cache", IsRequired = false, DefaultValue = true)] bool public Cache get return (bool) acest ["cache"];  set this ["cache"] = valoare; 

Clasa ConfigurationElement servește ca indexator pentru o colecție de proprietăți de configurare care stau la baza acesteia (de aici notația indexer a acestui [keyValue]). Folosind acest cuvânt cheie și accesând proprietatea de bază cu o cheie de șir, puteți obține și seta valoarea proprietății fără a avea nevoie de un câmp privat pentru a conține acele date. Colecția de proprietăți de bază stochează datele ca tip Object; prin urmare, trebuie să aruncați valoarea ca tip adecvat dacă doriți să faceți ceva cu ea.

Proprietățile care reprezintă atributele XML sunt decorate cu atributele ConfigurationPropertyAttribute. Primul parametru al atributului ConfigurationPropertyAttribute este numele atributului XML găsit în cadrul element. Urmând primul parametru sunt un set de orice număr de parametri numiți. Următoarea listă este o listă completă a parametrilor posibili:

  • DefaultValue - Obține sau stabilește valoarea implicită pentru proprietatea decorată. Acest parametru
    Nu este necesar.
  • IsDefaultCollection - Obține sau stabilește o valoare booleană indicând dacă proprietatea
    este colecția implicită de proprietate pentru proprietatea decorată. Acest parametru este
    nu este necesar, iar setarea implicită este falsă.
  • IsKey - Obține sau stabilește o valoare booleană indicând dacă această proprietate este o proprietate-cheie
    pentru proprietatea elementului decorat. Acest parametru nu este necesar și implicit
    valoarea este falsă.
  • IsRequired - Obține sau stabilește o valoare booleană indicând dacă elementul decorat
    proprietatea este obligatorie. Acest parametru nu este necesar și valoarea implicită este falsă.

Valoarea implicită a "http: // localhost" pentru proprietatea Url nu este o eroare. Sistemul .NET vă acordă, de asemenea, posibilitatea de a decora proprietățile cu atribute validator - cum ar fi RegexStringValidatorAttribute decorarea proprietății Url. Acest validator ia valoarea proprietății Url și îl validează în raport cu expresia regulată furnizată atributului; cu toate acestea, aceasta validează și proprietatea Url înainte de a conține datele din elementul XML. Valoarea implicită a proprietății Url este un șir gol când este creat un obiect FeedElement. Un șir gol nu se validează în raport cu expresia regulată furnizată, astfel încât validatorul aruncă o ArgumentException înainte ca orice date să fie încărcate din fișierul XML.

Există două soluții posibile pentru această problemă. Prima abordare modifică expresia regulată pentru a permite șirurilor goale. A doua abordare atribuie o valoare implicită proprietății. Nu contează în acest caz particular. Chiar și cu o valoare implicită, atributul url este încă un atribut obligatoriu în element - aplicația aruncă o ConfigurationErrorsException dacă o elementul nu are un atribut url.

Există mai multe atribute validator în spațiul de nume System.Configuration pentru a valida datele atribuite proprietăților și atributele XML pe care le cartografiază. Următoarea listă toate atributele validator din spațiul de nume System.Configuration:

  • CallbackValidatorAttribute - oferă o asociere între un obiect CallbackValidator și codul de validare - permite
    validare dinamică pentru o valoare de configurare.
  • IntegerValidatorAttribute - Validează folosind un obiect IntegerValidator pentru a determina dacă valoarea de configurare se încadrează în sau în afara unui anumit interval.
  • LongValidatorAttribute - Validează folosind un obiect LongValidator pentru a determina dacă valoarea de configurare se încadrează în sau în afara unui anumit interval.
  • PositiveTimeSpanValidatorAttribute - Validează folosind un obiect PositiveTimeSpanValidator pentru valori pozitive de configurare TimeSpan.
  • RegexStringValidatorAttribute - Validează folosind un obiect RegexStringValidator pentru a determina dacă valoarea de configurare aderă la expresia regulată.
  • StringValidatorAttribute - Validează folosind un obiect StringValidator pentru a se asigura că valoarea de configurare îndeplinește anumite criterii - cum ar fi lungimea șirului și caracterele nevalide.
  • SubclassTypeValidatorAttribute - Validează folosind un obiect SubclassTypeValidator pentru a determina dacă valoarea de configurare derivă dintr-un anumit tip.
  • TimeSpanValidatorAttribute - Validează folosind un obiect TimeSpanValidator pentru a determina dacă valoarea de configurare se încadrează în sau în afara unui anumit interval.

Cu excepția CallbackValidatorAttribute, nu trebuie să creați obiecte validator corespunzătoare care să fie utilizate împreună cu atributele validator. Modul .NET de execuție creează obiectele validator corespunzătoare pentru dvs., iar atributele conțin parametrii necesari pentru configurarea obiectelor validator.

Acest bit mic de cod este tot ceea ce este necesar pentru a reprezenta în mod individual elemente. Următorul pas este să scrieți o clasă care să reprezinte element.


Scrierea unei clase de colecții de elemente

Reprezentarea XML a element este cel al unei colecții de elemente de alimentare. De asemenea, reprezentarea programatică a element este o colecție de obiecte FeedElement. Această clasă, numită FeedElementCollection, derivă din clasa abstractă ConfigurationElementCollection.

Clasa ConfigurationElementCollection conține mai mulți membri, dar numai două sunt marcate ca abstract. Astfel, cea mai simplă implementare a ConfigurationElementCollection are două metode:

  • CreateNewElement () - Creează un nou obiect ConfigurationElement (FeedElement în acest
    caz).
  • GetElementKey () - Obține cheia elementului pentru un element de configurare specificat (
    Numele proprietății obiectelor FeedElement în acest caz).

Având în vedere acest lucru, vizualizați codul complet pentru clasa FeedElementCollection de mai jos:

[ConfigurationCollection (typeof (FeedElement)]] Clasa publică FeedElementCollection: ConfigurationElementCollection Protected override ConfigurationElement CreateNewElement () returnă nouă FeedElement ();  obiect protejat de suprascriere GetElementKey (element ConfigurationElement) return (element (FeedElement)) .Name; 

Un ConfigurationCollectionAttribute decorează această clasă de colectare. Primul parametru al atributului este un obiect Tip - tipul de elemente care conține colecția. În acest caz, este tipul FeedElement. După parametrul de tip sunt câțiva parametri numiți puteți trece la atribut. Acestea sunt enumerate mai jos:

  • AddItemName - Setează numele element de configurare. De exemplu,
    stabilirea acestuia ca "feed" ar necesita elemente în
    configurația care trebuie modificată .
  • ClearItemsName - Setează numele element de configurare (folosit
    pentru a șterge toate elementele din colecție).
  • RemoveItemName - Setează numele pentru element de configurare (folosit
    pentru a elimina un element din colecție).

Părăsirea acestor parametri numiți nu le-a validat , , .


Scrierea clasei FeedRetreiverSection

Clasa finală, numită FeedRetrieverSection, derivă din ConfigurationSection și reprezintă element. Aceasta este clasa cea mai simplă a claselor de configurare, deoarece singura cerință pe care trebuie să o îndeplinească este aceea de a oferi acces programatic la (elementul FeedElementCollection).

public class FeedRetrieverSection: ConfigurationSection [ConfigurationProperty ("feeds", IsDefaultCollection = true)] FeedElementCollection public Feeds get return (FeedElementCollection) acest ["feeds"];  set this ["feeds"] = value; 

Este o proprietate, de tip FeedElementCollection și numită Feed, este decorată cu o ConfigurationPropertyAttribute - cartografiază-o element.


Modificarea paginii web.config

Cu ajutorul instrumentului de configurare completă, puteți adăuga elementele corespunzătoare la web.config. secțiunea poate merge oriunde în fișier atâta timp cât este un descendent direct al elementului rădăcină ( element). Plasarea acestuia într-o altă secțiune de configurare duce la o eroare.

Următorul pas este adăugarea a

copil element la .
Elementul are două atribute de interes:

  • nume - Numele elementului secțiunii de configurare. În acest caz, numele este FeedRetriever.
  • tip - Numele calificat al clasei asociate secțiunii și, dacă este necesar,
    numele ansamblului în care se află clasa. În acest caz, numele calificat
    este FeedRetriever.Configuration.FeedRetrieverSection. Dacă locuiește într-un loc separat
    asamblare, atributul de tip ar avea o valoare de "FeedRetriever.Configuration.FeedRetrieverSection,
    ", Unde este numele ansamblului
    fără paranteze unghiulare.

Următoarele

element este ceea ce adăugați la un fișier web.config, sub , când clasele de configurare nu locuiesc într-un ansamblu separat (cum este cazul descărcării codului):

Acum, aplicația dvs. este configurată corespunzător pentru a utiliza clasele FeedRetrieverSection, FeedElementCollection și FeedElement pentru a vă acorda acces programatic la setările personalizate conținute în secțiune de configurare în web.config. Deci, cum accesați aceste setări din codul dvs.?


Accesarea datelor de configurare din cod

Spațiul de nume System.Configuration conține o clasă statică numită ConfigurationManager. Dacă utilizați pentru a găzdui șirurile de conectare, sunteți cel puțin familiarizat cu ConfigurationManager. Are o metodă numită GetSection (), care acceptă un șir care conține numele secțiunii de configurare pentru a fi preluat. Următorul cod demonstrează acest lucru (presupunem că folosind System.Configuration se află în partea de sus a fișierului de cod):

FeedRetrieverSection config = ConfigurationManager.GetSection ("FeedRetriever") ca FeedRetrieverSection;

Metoda GetSection () returnează o valoare de tip Object, deci trebuie să fie distribuită la orice tip de handler este pentru acea secțiune. Acest cod returnează secțiunea numită feedRetriever și exprimă rezultatul ca FeedRetrieverSection. Odată ce ați obiectul, puteți începe să accesați programele de configurare.

Pentru a vă da o idee despre modul în care setările de configurare pot fi utilizate în componenta sau aplicația dvs., următorul cod este o implementare foarte elementară a componentei FeedRetriever.

public class FeedRetriever static public FeedRetrieverSection _Config = ConfigurationManager.GetSection ("feedRetriever") ca FeedRetrieverSection;
public static void GetFeeds () foreach (FeedElement feedEl în _Config.Feeds) // cere cererea HttpWebRequest = (HttpWebRequest) WebRequest.Create (feedEl.Url); Răspunsul HttpWebResponse = (HttpWebResponse) request.GetResponse (); dacă (response.StatusCode == HttpStatusCode.OK) string feedData = String.Empty; folosind (cititor StreamReader = nou StreamReader (response.GetResponseStream ())) feedData = reader.ReadToEnd (); dacă (feedEl.Cache) // nume de fișier al fișierului cache filename = String.Format ("0 _ 1 .xml", feedEl.Name, DateTime.Now.Ticks); // utilizați fișierul cache (StreamWriter writer = StreamWriter nou (@ "C: \" + nume fișier)) writer.Write (feedData);

Mai întâi, o variabilă statică numită _Config, de tip FeedRetreiverSection, este declarată și atribuită o valoare apelând ConfigurationManager.GetSection (). Efectuarea variabilei statice este o alegere de design. Procedând astfel, toți membrii clasei, fie instanțe, fie statice, vor avea acces la setările de configurare fără a trebui să efectueze mai multe apeluri către GetSection ().

Odată ce ați preluat dispozitivul de tratare a secțiunilor cu GetSection (), aveți acces complet la obiectele create de clasele dvs. de handler. Prima linie a GetFeeds () este pentru fiecare buclă care străbate toate obiectele FeedElement conținute cu obiectul FeedElementCollection returnat de proprietatea Feeds. Acest lucru vă oferă acces direct la acele obiecte FeedElement - făcând ușor accesul la numele fiecărui feed, adresa URL și setările cache-ului.

În timpul fiecărei iterații a buclei, metoda face o cerere folosind proprietatea Url a obiectului FeedElement. În cazul în care cererea are succes, datele din feed sunt preluate și stocate în variabila feedData. Apoi, codul verifică proprietatea Cache a obiectului FeedElement pentru a determina dacă trebuie sau nu să se cacheze feedul. Caching-ul feed-ului implică construirea unui nume de fișier utilizând proprietatea Name a obiectului FeedElement și data și ora curente. Apoi, un obiect StreamWriter creează fișierul și scrie datele acestuia.

După cum puteți vedea, folosirea clasei handlerului secțiunii de configurare este cheia pentru a prelua și a utiliza setările personalizate din rețeaua web.config. Este cu siguranță nevoie de mai mult timp și efort de la dvs., dar cu siguranță vă face aplicația sau componenta mult mai ușor de configurat pentru dvs. și pentru alți dezvoltatori.


Vânzați componentele .NET pe CodeCanyon!



Știați că avem o categorie .NET pe CodeCanyon. Dacă sunteți un specialist .NET dev, de ce să nu vindeți scripturile / componentele / controalele ca autor și să câștigați 40-70% din fiecare vânzare?

  • Urmați-ne pe Twitter sau abonați la Nettuts + RSS Feed pentru cele mai bune tutoriale de dezvoltare web de pe web.
Cod