Sedan dess släppt har ASP.NET applikationer och komponenter tittat på web.config-filen för att ladda alla inställningar som de behöver för att fungera. Att lägga till anpassade inställningar för att lägga till flexibilitet och robusthet till en applikation eller komponent är dock inte så rakt fram som de flesta vill. Denna artikel lär dig hur du skriver de nödvändiga klasserna för att hantera XML-konfigurationselement och använda de inställningar de innehåller i din kod.
Publicerad handledningVarje par veckor besöker vi några av våra läsares favoritinlägg från hela webbplatsens historia. Denna handledning publicerades först i november 2012.
.NET Framework ger en mängd olika inställningar som kan konfigureras inom web.config för att ändra beteendet hos en eller flera inbyggda komponenter i programmet. För vissa utvecklare är det bara att hålla fast med inställningarna från .NET Framework. Men många fler utvecklare finner att de behöver styra en bredare samling inställningar - antingen för komponenter (skrivna av sig själva eller en tredje part), eller helt enkelt en uppsättning värden som de finner sig använda under hela deras tillämpning.
Web.config-filen tillåter dig att ställa in anpassade inställningar med
Key / Value inställningar kan säkert vara till hjälp under många omständigheter, men
Lyckligtvis tillåter Microsoft utvecklare att skriva klasser som lägger till programmatisk åtkomst till anpassade konfigurationsinställningar som finns i web.config.
Inställningar inom web.config kategoriseras i konfigurationssektioner. Till exempel, de inställningar som finns i
avsnittet gäller ASP.NET inställningar för din ansökan. Du kan ändra autentiseringsschemat för din app, samt lägga till eller ta bort HTTP-hanterare för att utföra specifika funktioner för specifika filtyper. De
En konfigurationssektion krävs av alla inställningar som inte finns i
Konfigurationen som används som exempel i den här handledningen är för en komponent som hämtar RSS- eller Atom-flöden. Det gör ingen parsing, eftersom det ligger utanför handledningen. I stället för att hårdkodning listan över feeds för att hämta ser komponenten ut sin konfiguration för att innehålla namnen och webbadresserna för feedsna som ska hämtas. Komponenten heter FeedRetriever, och den önskade XML-strukturen i dess konfiguration ser ut så här:
De
Dessa
Ovanstående konfiguration är enkel. De
Efter att ha utformat XML-strukturen är nästa steg att skriva en konfigurationshanterare för att bearbeta de inställningar som definieras i XML. Hanteraren är i första hand en klass som ärver från System.Configuration.ConfigurationSection, men det innehåller också användningen av andra klasser - som klasser som härrör från System.Configuration.ConfigurationElement och System.Configuration.ConfigurationElementCollection.
Klasser baserade på ConfigurationElement representerar enskilda element; Det är byggstenen i en konfigurationssektion. Typer som härrör från ConfigurationElementCollection representerar helt enkelt element som innehåller mer än en typ av element. Från konfigurationen som anges ovan,
ElementDu börjar med
Varje ConfigurationElement-objekt fungerar som en index för sin interna samling av egenskapsvärden. Det är den här interna samlingen, tillsammans med .NET-attribut, som gör att du kan kartlägga
Följande kod är den fullständiga koden för FeedElement-klassen:
public class FeedElement: ConfigurationElement [ConfigurationProperty ("namn", IsKey = true, IsRequired = true)] allmän sträng Namn get return (string) this ["name"]; sätta this ["name"] = value; [ConfigurationProperty ("url", IsRequired = true, DefaultValue = "http: // localhost")] [RegexStringValidator (@ "https? \: // \ S +")] offentlig sträng Url get return detta [ "uRL"]; sätta this ["url"] = value; [ConfigurationProperty ("cache", IsRequired = false, DefaultValue = true)] allmän boolcache get return (bool) this ["cache"]; sätta this ["cache"] = value;
Klassen ConfigurationElement fungerar som en indexerare till en underliggande samling av konfigurationsegenskaper (därav indexeringsbeteckningen för denna [keyValue]). Genom att använda detta nyckelord och få tillgång till den underliggande egenskapen med en strängnyckel kan du få och ställa in egenskapens värde utan att behöva ha ett privatfält för att innehålla den data. Den underliggande egenskapsuppsamlingen lagrar data som typ Objekt; Därför måste du kasta värdet som lämplig typ om du vill göra något med det.
Egenskaperna som representerar XML-attribut är dekorerad med attributen ConfigurationPropertyAttribute. Den första parametern för attributet ConfigurationPropertyAttribute är namnet på XML-attributet som finns i
Standardvärdet för "http: // localhost" för egenskapen Url är inte ett fel. .NET Framework ger dig också möjlighet att dekorera egenskaperna med valideringsattribut - till exempel RegexStringValidatorAttribute som dekorerar Url-egenskapen. Denna validator tar värdet av Url-egenskapen och validerar det mot det reguljära uttrycket som tillhandahålls till attributet; Det validerar dock egenskapen Url innan den innehåller data från XML-elementet. Standardvärdet för Url-egenskapen är en tom sträng när ett FeedElement-objekt skapas först. En tom sträng validerar inte mot det angivna reguljära uttrycket, så validatorn kastar en ArgumentException innan data laddas från XML-filen.
Det finns två möjliga lösningar för detta problem. Den första metoden ändrar det reguljära uttrycket för att tillåta tomma strängar. Det andra tillvägagångssättet tilldelar ett standardvärde till egenskapen. Det spelar ingen roll i det här speciella fallet. Även med ett standardvärde är urlattributet fortfarande ett obligatoriskt attribut i
Det finns flera andra validatorattribut i System.Configuration namespace för att validera data som tilldelas egenskaper och XML-attributen de kartlägger. Nedan listas alla valideringsattributen i namnfältet System.Configuration:
Med undantag för CallbackValidatorAttribute behöver du inte skapa motsvarande validatorobjekt att använda tillsammans med validatorattributen. .NET runtime skapar lämpliga validatorobjekt för dig, och attributen innehåller de nödvändiga parametrarna för att konfigurera validatorobjekten.
Denna lilla bit av kod är allt som krävs för att programmera individuellt
XML-representationen av
Klassen ConfigurationElementCollection innehåller flera medlemmar, men endast två är markerade som abstrakta. Således har det enklaste KonfigurationsElementCollection-genomförandet två metoder:
Med det i åtanke, se den fullständiga koden för klassen FeedElementCollection nedan:
[ConfigurationCollection (typeof (FeedElement)) offentlig klass FeedElementCollection: ConfigurationElementCollection protected override ConfigurationElement CreateNewElement () returnera nytt FeedElement (); skyddad överstyrning objekt GetElementKey (ConfigurationElement element) return ((FeedElement) element) .Name;
Ett ConfigurationCollectionAttribute dekorerar denna samlingsklass. Den första parametern till attributet är ett typobjekt - vilken typ av objekt samlingen innehåller. I det här fallet är det FeedElement-typen. Efter typparametern finns flera namngivna parametrar kan du skicka till attributet. Dessa listas nedan:
Om du lämnar dessa namngivna parametrar ska du blanka dem till
Den slutliga klassen, som heter FeedRetrieverSection, härrör från ConfigurationSection och representerar
public class FeedRetrieverSection: ConfigurationSection [ConfigurationProperty ("feeds", IsDefaultCollection = true)] offentliga FeedElementCollection-flöden få return (FeedElementCollection) detta ["feeds"]; set this ["feeds"] = värde;
Det är en egenskap, av typen FeedElementCollection och kallas Feeds, är dekorerad med ett ConfigurationPropertyAttribute - kartlägger det till
När konfigurationshanteraren är klar kan du lägga till lämpliga element för web.config. De
Nästa steg är att lägga till en barnelement till
Det följande Elementet är det du lägger till i en web.config-fil, under
Nu är din ansökan korrekt konfigurerad för att använda FeedRetrieverSection, FeedElementCollection och FeedElement-klasserna för att ge dig programmatisk åtkomst till de anpassade inställningarna som finns i
Navnet System.Configuration innehåller en statisk klass som heter ConfigurationManager. Om du använder
FeedRetrieverSection config = ConfigurationManager.GetSection ("feedRetriever") som FeedRetrieverSection;
Metoden GetSection () returnerar ett värde av typen Objekt, så det måste kastas till vilken typ som handlaren är för den delen. Denna kod hämtar avsnittet namnet feedRetriever och kastar resultatet som FeedRetrieverSection. När du har objektet kan du börja med att få tillgång till konfigurationsdata programmerat.
För att ge dig en uppfattning om hur konfigurationsinställningar kan användas inom din komponent eller applikation är följande kod en mycket grundläggande implementering av FeedRetriever-komponenten.
offentliga klass FeedRetriever offentliga statiska FeedRetrieverSection _Config = ConfigurationManager.GetSection ("feedRetriever") som FeedRetrieverSection;
public static void GetFeeds () foreach (FeedElement feedEl i _Config.Feeds) // göra förfrågan HttpWebRequest request = (HttpWebRequest) WebRequest.Create (feedEl.Url); HttpWebResponse response = (HttpWebResponse) request.GetResponse (); om (response.StatusCode == HttpStatusCode.OK) string feedData = String.Empty; använder (StreamReader reader = new StreamReader (response.GetResponseStream ())) feedData = reader.ReadToEnd (); om (feedEl.Cache) // filnamn för cachen filsträng filename = String.Format ("0 _ 1 .xml", feedEl.Name, DateTime.Now.Ticks); // cachefil med (StreamWriter writer = nytt StreamWriter (@ "C: \" + filnamn)) writer.Write (feedData);
Först deklareras en statisk variabel som heter _Config, av typen FeedRetreiverSection, och tilldelas ett värde genom att ringa ConfigurationManager.GetSection (). Att göra variabeln statisk är ett designval. Genom att göra så skulle alla medlemmar i klassen, antingen instans eller statisk, ha tillgång till konfigurationsinställningarna utan att behöva göra flera samtal till GetSection ().
När du hämtar sektionshanteraren med GetSection () har du fullständig tillgång till objekt som skapats från dina hanterarklasser. Den första raden av GetFeeds () är en för varje slinga som slingrar igenom alla FeedElement-objekt som ingår i FeedElementCollection-objektet som returneras av egenskapen Feeds. Detta ger dig direkt tillgång till dessa FeedElement-objekt - vilket gör det enkelt att komma åt varje flödes namn, URL och cache-inställningar.
Under varje iteration av slingan gör metoden en förfrågan med hjälp av FeedElement-objektets Url-egenskap. Om förfrågan resulterar i en framgång, hämtas foderets data och lagras i varianten feedData. Då kontrollerar koden feedElement-objektets Cache-egenskap för att avgöra huruvida cachen ska cachas eller ej. Caching i foderet innebär att man konstruerar ett filnamn med hjälp av FeedElement-objektets namnegenskap och aktuellt datum och tidpunkt. Då skapar ett StreamWriter-objekt filen och skriver matarens data till den.
Som du kan se är användarklasserna nyckelkod för att hämta och använda anpassade inställningar som finns i web.config. Det kräver säkert mer tid och ansträngning från dig, men det gör definitivt din applikation eller komponent mycket lättare att konfigurera för dig själv och andra utvecklare.
Visste du att vi har en .NET-kategori på CodeCanyon. Om du är en skicklig. NET dev, varför inte sälja dina skript / komponenter / kontroller som författare och tjäna 40-70% av varje försäljning?