Slik legger du til egendefinerte konfigurasjonsinnstillinger for en (ASP) .NET-applikasjon

Siden utgivelsen har ASP.NET applikasjoner og komponenter kikket til web.config-filen for å laste inn eventuelle innstillinger de trenger for å fungere. Men legger du til egendefinerte innstillinger for å legge til fleksibilitet og robusthet til et program eller en komponent, er ikke like rett frem som de fleste ønsker. Denne artikkelen lærer deg hvordan du skriver de nødvendige klassene for å håndtere XML-konfigurasjonselementer og bruke innstillingene de inneholder i koden din.

Publisert opplæring

Noen få uker besøker vi noen av leserens favorittinnlegg fra hele historien til nettstedet. Denne opplæringen ble først publisert i november 2012.

.NET Framework gir et bredt utvalg av innstillinger som kan konfigureres i web.config for å endre oppførselen til en eller flere innebygde komponenter i applikasjonen. For noen utviklere er det nok å stikke bare med innstillingene fra .NET Framework. Men mange flere utviklere finner at de trenger å kontrollere en bredere samling av innstillinger - enten for komponenter (skrevet av seg selv eller en tredjepart), eller bare et sett med verdier de finner seg i hele sin søknad.

Web.config-filen tillater deg å angi egendefinerte innstillinger med element, men det tillater ikke noe annet enn enkle nøkkel / verdi par. Følgende XML-element er et eksempel på en innstilling som finnes i :

Nøkkel / Verdi innstillinger kan sikkert være nyttig under mange omstendigheter, men Innstillingene er ganske enkelt ikke fleksible nok til robuste eller komplekse komponenter eller innstillinger.

Heldigvis lar Microsoft utviklere skrive klasser som legger til programmatisk tilgang til egendefinerte konfigurasjonsinnstillinger som finnes i web.config.


Konfigurasjonsseksjonen

Innstillinger i web.config er kategorisert i konfigurasjonsseksjoner. For eksempel er innstillingene som finnes i delen gjelder ASP.NET innstillinger for søknaden din. Du kan endre autentiseringsskjemaet til appen din, samt legge til eller fjerne HTTP-håndtere for å utføre bestemte funksjoner for bestemte filtyper. De delen lar deg kontrollere mange av IIS7s innstillinger uten direkte tilgang til IIS7.

En konfigurasjonsseksjon er nødvendig for alle innstillinger som ikke finnes i element. Så det er en god ide å utforme XML-strukturen i konfigurasjonsinnstillingene før du skriver kode.

Konfigurasjonen som brukes som et eksempel i denne opplæringen, er for en komponent som henter RSS- eller Atom-feeder. Det gjør ingen parsing, da det er utenfor omfanget av denne opplæringen. I stedet for hard koding listen over feeds for å hente, ser komponenten ut til konfigurasjonen for å inneholde navnene og nettadressene til feeds for å hente. Komponenten heter FeedRetriever, og den ønskede XML-strukturen i konfigurasjonen ser slik ut:

      

De element defineres av konfigurasjonsseksjonen. Som regel bør en konfigurasjonsseksjon dele navnet på komponenten den er laget for. De element bare barn er element. Tenk på dette elementet som en samling av feeds fordi den inneholder flere elementer (tenk på Add () -metoden som de fleste samlingsobjekter har). Valget av å bruke et element kalt "add" kan virke rart i begynnelsen, men elementet brukes i de fleste innbyggede konfigurasjonsseksjoner. Så bruker du det her følger bare designspraksis som Microsoft har lagt fram.

Disse elementer bruker navn, URL og cache attributter for å angi visse innstillinger for hver feed. Naturligvis er navn og URL-attributter kreves, men cacheattributtet er ikke, og skal standard som sant.

Den ovennevnte konfigurasjonen er enkel. De elementet kan endres for å inneholde et annet barn, kalt , å inneholde innstillinger som vil gjelde for alle feeds. De elementer kan også bruke flere attributter, for eksempel cacheTime og requestFrequency, for å kontrollere hvor lenge en feed er cached, og hvor ofte det blir forespurt fra den eksterne verten. Den eneste grensen til utvidbarheten og konfigurerbarheten er fantasien din.


Skriver konfigurasjonshåndtereren

Etter å ha utformet XML-strukturen, er neste trinn å skrive en konfigurasjonshåndterer for å behandle innstillingene definert i XML. Handler er først og fremst en klasse som arver fra System.Configuration.ConfigurationSection, men den inneholder også bruk av andre klasser - for eksempel klasser som kommer fra System.Configuration.ConfigurationElement og System.Configuration.ConfigurationElementCollection.

Klasser basert på ConfigurationElement representerer individuelle elementer; Det er byggeklossen i en konfigurasjonsseksjon. Typer som kommer fra ConfigurationElementCollection representerer bare elementer som inneholder mer enn én type element. Fra konfigurasjonen som er oppført ovenfor, vil element er representert av en klasse som kommer fra ConfigurationElementCollection, og elementene er representert av en ConfigurationElement-basert klasse.


Representerer Element

Du starter med element ved å representere det med en klasse som heter FeedElement (avledet fra ConfigurationElement). Denne klassen, og fremtidige konfigurasjonsrelaterte klasser, ligger i navnetrommet FeedRetriever.Configuration.

Hver ConfigurationElement-objekt fungerer som en indekser for intern samling av eiendomsverdier. Det er denne interne samlingen, sammen med .NET attributter, som gjør at du kan kartlegge Elementets attributter til egenskapene til FeedElement-klassen.

Følgende kode er den komplette koden for FeedElement-klassen:

offentlig klasse FeedElement: ConfigurationElement [ConfigurationProperty ("navn", IsKey = true, IsRequired = true)] offentlig streng Navn get return (string) this ["name"];  sett dette ["navn"] = verdi;  [ConfigurationProperty ("url", IsRequired = true, DefaultValue = "http: // localhost")] [RegexStringValidator (@ "https? \: // \ S +")] offentlig streng Url get return dette [ "url"];  sett denne ["url"] = verdi;  [ConfigurationProperty ("cache", IsRequired = false, DefaultValue = true)] offentlig bool Cache get return (bool) this ["cache"];  sett dette ["cache"] = verdi; 

Klassen ConfigurationElement tjener som en indekser til en underliggende samling av konfigurasjonsegenskaper (dermed indeksnoteringen til denne [keyValue]). Ved å bruke dette søkeordet og få tilgang til den underliggende egenskapen med en strengnøkkel, kan du få og angi egenskapen til verdien uten at det må være et privat felt å inneholde dataene. Den underliggende eiendomsinnsamlingen lagrer data som type Objekt; Derfor må du kaste verdien som den aktuelle typen hvis du vil gjøre noe med det.

Egenskapene som representerer XML-attributter er dekorert med ConfigurationPropertyAttribute attributter. Den første parameteren til attributten ConfigurationPropertyAttribute er navnet på XML-attributtet som finnes i element. Etter den første parameteren er et sett med et hvilket som helst antall navngitte parametere. Følgende liste er en komplett liste over mulige parametere:

  • DefaultValue - Går inn eller angir standardverdien for den dekorerte egenskapen. Denne parameteren
    er ikke obligatorisk.
  • IsDefaultCollection - Gets eller en setter en boolsk verdi som indikerer om eiendommen
    er standard eiendom samling for den innredede eiendommen. Denne parameteren er
    ikke nødvendig, og standard er feil.
  • IsKey - Går inn eller angir en boolsk verdi som indikerer om denne egenskapen er en nøkkelegenskap
    for den dekorerte elementegenskapen. Denne parameteren er ikke nødvendig, og standard
    verdien er feil.
  • Er Required - Går inn eller setter en boolsk verdi som indikerer om det dekorerte elementet
    eiendom er nødvendig. Denne parameteren er ikke nødvendig, og standardverdien er feil.

Standardverdien for "http: // localhost" for egenskapen Url er ikke en feil. .NET Framework gir deg også muligheten til å dekorere egenskapene med validatorattributter - for eksempel RegexStringValidatorAttribute som dekorerer egenskapen Url. Denne validatoren tar verdien av Url-egenskapen og validerer den mot det vanlige uttrykket som er gitt til attributtet; Det bekrefter imidlertid også egenskapen Url før den inneholder dataene fra XML-elementet. Standardverdien for egenskapen Url er en tom streng når et FeedElement-objekt først opprettes. En tom streng bekreftes ikke mot det angitte regulære uttrykket, slik at validatoren kaster en ArgumentException før noen data lastes fra XML-filen.

Det er to mulige løsninger for dette problemet. Den første tilnærmingen endrer det vanlige uttrykket for å tillate tomme strenger. Den andre tilnærmingen tilordner en standardverdi til eiendommen. Det spiller ingen rolle i dette tilfellet. Selv med en standardverdi er URL-attributtet fortsatt et nødvendig attributt i element - programmet kaster en ConfigurationErrorsException hvis en elementet har ikke et URL-attributt.

Det finnes flere andre validatorattributter i system.Configuration namespace for å validere data som er tilordnet egenskaper og XML-attributter de kartlegger. Følgende viser alle validatorattributtene i System.Configuration namespace:

  • CallbackValidatorAttribute - Gir en tilknytning mellom et CallbackValidator-objekt og koden som skal validere - tillater
    dynamisk validering for en konfigurasjonsverdi.
  • IntegerValidatorAttribute - Validerer ved hjelp av et IntegerValidator objekt for å avgjøre om konfigurasjonsverdien faller innenfor eller utenfor et bestemt område.
  • LongValidatorAttribute - Validerer ved hjelp av et LongValidator objekt for å avgjøre om konfigurasjonsverdien faller innenfor eller utenfor et bestemt område.
  • PositiveTimeSpanValidatorAttribute - Validerer ved hjelp av et PositiveTimeSpanValidator-objekt for positive TimeSpan-konfigurasjonsverdier.
  • RegexStringValidatorAttribute - Validerer ved hjelp av et RegexStringValidator-objekt for å avgjøre om konfigurasjonsverdien overholder det vanlige uttrykket.
  • StringValidatorAttribute - Validerer ved hjelp av et StringValidator objekt for å sikre at konfigurasjonsverdien oppfyller visse kriterier - for eksempel strenglengde og ugyldige tegn.
  • SubclassTypeValidatorAttribute - Validerer ved hjelp av et SubclassTypeValidator objekt for å avgjøre om konfigurasjonsverdien kommer av en gitt type.
  • TimeSpanValidatorAttribute - Validerer ved hjelp av et TimeSpanValidator-objekt for å avgjøre om konfigurasjonsverdien faller innenfor eller utenfor et bestemt område.

Med unntak av CallbackValidatorAttribute, trenger du ikke å opprette tilsvarende validatorobjekter som skal brukes sammen med validatorattributtene. .NET runtime lager de aktuelle validatorobjektene for deg, og attributter inneholder de nødvendige parametrene for å konfigurere validatorobjektene.

Denne lille koden er alt som kreves for å representere individuelt elementer. Det neste trinnet er å skrive en klasse som representerer element.


Skrive en Element Collection Class

XML-representasjonen av element er det for en samling av fôringselementer. På samme måte er den programmatiske representasjonen av Elementet er en samling av FeedElement-objekter. Denne klassen, kalt FeedElementCollection, kommer fra den abstrakte ConfigurationElementCollection-klassen.

Klassen ConfigurationElementCollection inneholder flere medlemmer, men bare to er merket som abstrakte. Dermed har den enkleste KonfigurasjonElementCollection-implementeringen to metoder:

  • CreateNewElement () - Oppretter en ny ConfigurationElement-objekt (FeedElement i dette
    sak).
  • GetElementKey () - Går elementstasten for et spesifisert konfigurasjonselement (the
    Navn eiendom av FeedElement objekter i dette tilfellet).

Med det for øye, se hele koden for FeedElementCollection-klassen nedenfor:

[ConfigurationCollection (typeof (FeedElement)) offentlig klasse FeedElementCollection: ConfigurationElementCollection beskyttet overstyring ConfigurationElement CreateNewElement () returner nytt FeedElement ();  beskyttet overstyringsobjekt GetElementKey (ConfigurationElement element) return ((FeedElement) element) .Name; 

En ConfigurationCollectionAttribute dekorerer denne samlingen klassen. Den første parameteren til attributtet er et Type-objekt - typen av elementene samlingen inneholder. I dette tilfellet er det FeedElement-typen. Etter typeparameteren er flere navngitte parametere du kan overføre til attributtet. Disse er oppført nedenfor:

  • AddItemName - Angir navnet på konfigurasjonselement. For eksempel,
    å sette dette som "feed" ville kreve elementer i
    konfigurasjonen skal endres til .
  • ClearItemsName - Angir navnet på konfigurasjonselement (brukt
    for å slette alle gjenstander fra samlingen).
  • RemoveItemName - Angir navnet på konfigurasjonselement (brukt
    å fjerne et element fra samlingen).

Hvis du forlater disse navngitte parametrene, blir de deaktivert , , .


Skriver FeedRetreiverSection Class

Den endelige klassen, kalt FeedRetrieverSection, kommer fra ConfigurationSection og representerer element. Dette er den enkleste klassen av konfigurasjonsklassene, da det eneste kravet må møtes er å gi programmatisk tilgang til elementet (FeedElementCollection).

offentlig klasse FeedRetrieverSection: ConfigurationSection [ConfigurationProperty ("feeds", IsDefaultCollection = true)] offentlige FeedElementCollection Feeds få return (FeedElementCollection) denne ["feeds"];  sett dette ["feeds"] = verdi; 

Det er en eiendom, av typen FeedElementCollection og kalles Feeds, er dekorert med en ConfigurationPropertyAttribute - kartlegger den til element.


Endre web.config

Når konfigurasjonshåndteringen er fullført, kan du legge til de aktuelle elementene til web.config. De seksjonen kan gå hvor som helst i filen så lenge det er en direkte nedstigning av rotelementet (den element). Hvis du plasserer det i en annen konfigurasjonsseksjon, oppstår en feil.

Det neste trinnet er å legge til en

barn element til . De
elementet har to attributter av interesse:

  • navn - navnet på konfigurasjonsseksjonen. I dette tilfellet er navnet feedRetriever.
  • type - Det kvalifiserte navnet på klassen som er knyttet til seksjonen, og om nødvendig,
    navnet på forsamlingen klassen ligger i. I dette tilfellet er det kvalifiserte navnet
    er FeedRetriever.Configuration.FeedRetrieverSection. Hvis den ligger i en egen
    montering vil typen attributt ha en verdi av "FeedRetriever.Configuration.FeedRetrieverSection,
    ", hvor er navnet på forsamlingen
    uten vinkelbeslagene.

Følgende

elementet er det du legger til i en web.config-fil, under , når konfigurasjonsklassene ikke bor i en separat enhet (som det er tilfellet i kodedownloaden):

Nå er søknaden din riktig konfigurert til å bruke FeedRetrieverSection, FeedElementCollection og FeedElement-klassene for å gi deg programmatisk tilgang til de egendefinerte innstillingene som finnes i konfigurasjonsseksjonen i web.config. Så hvordan får du tilgang til disse innstillingene fra din kode?


Å få tilgang til konfigurasjonsdata fra kode

Navnet System.Configuration inneholder en statisk klasse som kalles ConfigurationManager. Hvis du bruker delen for å huse tilkoblingsstrenger, er du minst kjent med ConfigurationManager. Den har en metode som heter GetSection (), som aksepterer en streng som inneholder navnet på konfigurasjonsdelen for å hente. Følgende kode viser dette (antar å bruke System.Configuration er øverst i kodefilen):

FeedRetrieverSection config = ConfigurationManager.GetSection ("feedRetriever") som FeedRetrieverSection;

Metoden GetSection () returnerer en verdi av typen Objekt, så det må kastes til hvilken type handleren er for den delen. Denne koden henter delen som heter feedRetriever, og kaster resultatet som FeedRetrieverSection. Når du har objektet, kan du begynne å få tilgang til konfigurasjonsdata programmatisk.

For å gi deg en ide om hvordan konfigurasjonsinnstillinger kan brukes i komponenten eller applikasjonen, er følgende kode en svært grunnleggende implementering av FeedRetriever-komponenten.

offentlig klasse FeedRetriever offentlig statisk FeedRetrieverSection _Config = ConfigurationManager.GetSection ("feedRetriever") som FeedRetrieverSection;
offentlig statisk tomgang GetFeeds () foreach (FeedElement feedEl i _Config.Feeds) // gjøre forespørsel HttpWebRequest request = (HttpWebRequest) WebRequest.Create (feedEl.Url); HttpWebResponse response = (HttpWebResponse) request.GetResponse (); hvis (response.StatusCode == HttpStatusCode.OK) string feedData = String.Empty; bruker (StreamReader reader = ny StreamReader (response.GetResponseStream ())) feedData = reader.ReadToEnd (); hvis (feedEl.Cache) // filnavn for cache filstreng filename = String.Format ("0 _ 1 .xml", feedEl.Name, DateTime.Now.Ticks); // cache-fil ved hjelp av (StreamWriter writer = nytt StreamWriter (@ "C: \" + filnavn)) writer.Write (feedData);

Først er en statisk variabel kalt _Config, av typen FeedRetreiverSection, deklarert og tildelt en verdi ved å ringe ConfigurationManager.GetSection (). Å gjøre variabelen statisk er et design valg. Ved å gjøre det, ville alle medlemmer av klassen, enten instans eller statisk, ha tilgang til konfigurasjonsinnstillingene uten å måtte foreta flere anrop til GetSection ().

Når du henter seksjonsbehandleren med GetSection (), har du full tilgang til objekter opprettet fra handlerklassene dine. Den første linjen i GetFeeds () er en for hver krets som løper gjennom alle FeedElement-objekter som er inneholdt i FeedElementCollection-objektet som returneres av egenskapen Feeds. Dette gir deg direkte tilgang til disse FeedElement-objektene, noe som gjør det enkelt å få tilgang til hver feeds navn, URL og bufferinnstillinger.

Under hver iterasjon av sløyfen, gjør metoden en forespørsel ved bruk av FeedElement-objektets Url-egenskap. Hvis forespørselen gir en suksess, hentes dataene fra fôret og lagres i variabelen feedData. Koden kontrollerer deretter FeedElement-objektets Cache-egenskap for å avgjøre om cachen skal cache eller ikke. Caching i fôret innebærer å bygge et filnavn ved å bruke FeedElement-objektets Navnegenskap og gjeldende dato og klokkeslett. Deretter oppretter et StreamWriter-objekt filen og skriver feedens data til den.

Som du kan se, bruker konfigurasjonsdelen handlerklasser nøkkelen til å hente og bruke egendefinerte innstillinger som ligger i web.config. Det krever absolutt mer tid og krefter fra deg, men det gjør definitivt din applikasjon eller komponent mye enklere å konfigurere for deg selv og andre utviklere.


Selg .NET-komponentene på CodeCanyon!



Visste du at vi har en .NET-kategori på CodeCanyon. Hvis du er en dyktig. NET dev, hvorfor ikke selg dine skript / komponenter / kontroller som forfatter, og tjen 40-70% av hvert salg?

  • Følg oss på Twitter, eller abonner på Nettuts + RSS-feed for de beste webutviklingsopplæringene på nettet.