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æringNoen 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
Nøkkel / Verdi innstillinger kan sikkert være nyttig under mange omstendigheter, men
Heldigvis lar Microsoft utviklere skrive klasser som legger til programmatisk tilgang til egendefinerte konfigurasjonsinnstillinger som finnes i web.config.
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
En konfigurasjonsseksjon er nødvendig for alle innstillinger som ikke finnes i
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
Disse
Den ovennevnte konfigurasjonen er enkel. De
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
ElementDu starter med
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
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
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
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:
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
XML-representasjonen av
Klassen ConfigurationElementCollection inneholder flere medlemmer, men bare to er merket som abstrakte. Dermed har den enkleste KonfigurasjonElementCollection-implementeringen to metoder:
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:
Hvis du forlater disse navngitte parametrene, blir de deaktivert
Den endelige klassen, kalt FeedRetrieverSection, kommer fra ConfigurationSection og representerer
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
Når konfigurasjonshåndteringen er fullført, kan du legge til de aktuelle elementene til web.config. De
Det neste trinnet er å legge til en barn element til
Følgende elementet er det du legger til i en web.config-fil, under
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
Navnet System.Configuration inneholder en statisk klasse som kalles ConfigurationManager. Hvis du bruker
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.
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?