.NET Tip: Create a Custom Configuration Section in .NET 2.0

The configuration file concept in .NET makes it much easier to change runtime settings without having to recompile. These files hearken back to the days of .INI files in previous versions of Windows, long before the dreaded Registry. Although you can keep all your settings in the appSettings section, you also can add your own custom configuration sections to make your settings a bit more orderly and easy to find within a configuration file. This tip shows you how to build a custom configuration section to hold settings dealing with sending e-mail.

The Configuration Class

The first thing you need is a configuration class that derives from the System.Configuration.ConfigurationSection class. This class will have a property for each configuration property you want to set. Here's the class I created:

public class MailManagerConfiguration : ConfigurationSection
{
   public MailManagerConfiguration()
   {
   }

   [ConfigurationProperty("serverAddress",
                          DefaultValue = "mail.northcomp.com",
                          IsRequired = true)]
   public String MailServer
   {
      get
      { return (String)this["serverAddress"]; }
      set
      { this["serverAddress"] = value; }
   }

   [ConfigurationProperty("messageTemplate", IsRequired = true)]
   public String MessageTemplate
   {
      get
      { return (String)this["messageTemplate"]; }
      set
      { this["messageTemplate"] = value; }
   }

   [ConfigurationProperty("baseURL", IsRequired = true)]
   public String BaseURL
   {
      get
      { return (String)this["baseURL"]; }
      set
      { this["baseURL"] = value; }
   }

   [ConfigurationProperty("from",
   DefaultValue = "Eric Smith <eric@northcomp.com>",
      IsRequired = true)]
   public String ReturnAddress
   {
      get
      { return (String)this["from"]; }
      set
      { this["from"] = value; }
   }

   [ConfigurationProperty("title", DefaultValue =
                          "Announcement from Eric :: {0}",
                          IsRequired = true)]
   public String TitleFormat
   {
      get
      { return (String)this["title"]; }
      set
      { this["title"] = value; }
   }
}

This class has the following five properties:

  • One for the address of the mail server
  • One for the template for the message
  • A base URL for all the links and images
  • A return address
  • A title format for the message subject

From this example, you can see how these properties can be required or optional and can have a default value in case one is not specified in the configuration file.

The configuration file needs the following code to use this configuration section:

<configuration>
   <configSections>
      <section name="MailManagerConfiguration"
               type="MyLibrary.MailManagerConfiguration,
                     MyLibrary" />
   </configSections>
   <MailManagerConfiguration
      serverAddress="mail.myserver.com"
      messageTemplate="C:\Web\mailmanager\template.html"
      baseURL="http://www.northcomp.com"
      from="Northstar Computer Systems
         &lt;clientcenter@northcomp.com&gt;"
      title="My Web Site:: {0}" />

The type parameter in the section tag first references the full name of the class (including any namespace), followed by the class name by itself. I generally keep these classes in a separate library for just this reason.

Each of the parameters in the configuration class has a corresponding value in the MailManagerConfiguration tag, as you can see above. The purpose of each value is specific to what the class needs, but you can see how to lay things out in the configuration file.

Instantiate the Configuration Class

The last step is instantiating the configuration class and using the properties, as shown here:

MailManagerConfiguration config =
   (MailManagerConfiguration)ConfigurationManager.GetSection
   ("MailManagerConfiguration");

Once you have this class instantiated, you can read any of the properties, such as config.ReturnAddress, config.TitleFormat, and so on.

By creating this custom configuration section, you've made your class more modular and not reliant on the generic appSettings section in the configuration file. Users who work with the class will know what the settings are for and be able to access them more easily in their code.

About the Author

Eric Smith is the owner of Northstar Computer Systems, a Web-hosting company based in Indianapolis, Indiana. He is also a MCT and MCSD who has been developing with .NET since 2001. In addition, he has written or contributed to 12 books covering .NET, ASP, and Visual Basic.



Comments

  • Using Collections inside the section

    Posted by Magallo on 04/11/2007 11:18am

    I saw in your example that your MailManagerConfiguration class contains only String properties. Is there the possibility to use a Collection or a List or an array of "something" as a property of my ConfigurationSection derived class? I mean, in my section data I have a list of "somedata" and I would like to have a property inside my class that is a sort of List or something like that. Can you make an exapmple? Thanks.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Lenovo recommends Windows 8 Pro. "I dropped my laptop getting out of the taxi." This probably sounds familiar to most IT professionals. If your employees are traveling, you know their devices are in for a rough go. Whether it's a trip to the conference room or a convention out of town, any time equipment leaves a user's desk it is at risk of being put into harm's way. Stay connected at all times, whether at the office or on the go, with agile, durable, and flexible devices like the Lenovo® …

  • U.S. companies are desperately trying to recruit and hire skilled software engineers and developers, but there's simply not enough quality talent to go around. In response, companies often resort to inferior solutions -- hiring substandard developers and engineers, recruiting talent on a part-time or temporary basis, poaching people from competitors, or burdening an already stressed IT staff for more of their labor. Fortunately, there's a better solution. Read this white paper to learn the business value of …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date