Monday, September 10, 2007

Using SingleTagSectionHandler Instead Of appSettings

While working with any kind of configuration files in .NET, be it Web.config in case of ASP.NET or App.config in case of Windows Forms applications, we very often use the appSettings section. We use it to store all kinds of simple configuration options. Options, that are too simple for us to implement a completely new SectionHandler type. There is however one problem with appSettings section not very expressive.

What does it mean to be expressive? Consider the following example:

<appSettings >   <add key=" source1user" value="user"  />
<add key ="source1password" value=" pass" /> </
appSettings>

In simple cases, it may be acceptable, but what happens if more user keys are required for some reason? Maybe we need to access few different locations, each of which requires a username and password? We may use some kind of prefix for each key like in the above example, but that is not very elegant. What is key and value anyway?

Another obvious problem here is when we need to have 2 parameters associated with a single logical functionality in the application, we need 2 entries in appSettings section.

If we still don't want to implement a new SectionHandler type, we have very nice option left: SingleTagSectionHandler.

MSDN describes it as: "Handles configuration sections that are represented by a single XML tag in the .config file". And that's about it. Unfortunately, (as usual) MSDN provides no example of how to use it. Fortunately it is quite simple:

<configSections>   <section name=" remoteDataSource" type="System.Configuration.SingleTagSectionHandler " /> </configSections>  <remoteDataSource username=" user" password="pass"  url="http://remote/"  />

Using the newly declared section from the code is also easy:

Hashtable remoteDataSource =  (Hashtable)WebConfigurationManager.GetSection("remoteDataSource"); string username = (string)remoteDataSource["username"]; string password = (string)remoteDataSource["password"]; string url = (string)remoteDataSource["url"];
Simple, yet useful.
 

0 comments: