IConfigurationSectionHandler example
January 01, 2010
This is a small snippet for the basics of writing a ConfigurationHandler to read a configuration section from your web.config or app.config. Since I wrote this I’ve moved to the easier ConfigSection way of doing things, there’s an example here.
You start off with the XML definition in the config file:
<configSections> | |
<section name="mysection" type="MyNamespace.ConfigurationHandler,Mynamespace" /> | |
</configSections> | |
<mysection> | |
<security enabled="true" /> | |
<username>bob</username> | |
</mysection> |
And then define your own parser class, and a Settings class to store the details in:
public class ConfigurationHandler : IConfigurationSectionHandler | |
{ | |
/// <summary> | |
/// Creates a <see cref="Settings"/> object from the configuration file. | |
/// </summary> | |
/// <seealso cref="Settings"/> | |
public object Create(object parent, object configContext, System.Xml.XmlNode section) | |
{ | |
if (section == null) | |
throw new ArgumentNullException("'section' is null. Check your app.config or web.config exists and is valid."); | |
try | |
{ | |
Settings settings = new Settings(); | |
// Security | |
XmlNode node = section.SelectSingleNode("//security"); | |
if (node != null) | |
Settings.Security = (node.Attributes["enabled"].Value == "true"); | |
else | |
throw new Exception("No security node could be found in the web/app.config"); | |
// Username | |
node = section.SelectSingleNode("//username"); | |
if (node != null) | |
settings.Username = node.Value; | |
else | |
throw new Exception("No username could be found in the web/app.config"); | |
return settings; | |
} | |
catch (XPathException ex) | |
{ | |
// Catch From SelectSingleNode,SelectNodes | |
throw new Exception("XPathException caught when reading config file", ex); | |
} | |
} | |
} | |
public class Settings | |
{ | |
public bool Security { get; set; } | |
public string Username { get; set; } | |
} |
And then when you application first initializes, read the settings like so:
var settings = (Settings)ConfigurationManager.GetSection("mysection");
An alternative way of doing this is to make the Settings class responsible for initializing itself inside a static constructor, using the above line. You would then make the Settings class a singleton.
I'm Chris Small, a software engineer working in London. This is my tech blog. Find out more about me via Github, Stackoverflow, Resume