.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

  • Recently, Forrester Consulting conducted a Total Economic Impact™ (TEI) study to better understand the impact of incorporating Polycom voice solutions with Microsoft Lync. Forrester interviewed a company that had already deployed the Lync/Polycom combination to determine its potential return on investment (ROI). Microsoft Lync provides presence information and promotes voice and video collaboration. Polycom extends the benefits of Lync with voice endpoints and further enables collaboration in multiple …

  • IBM Worklight is a mobile application development platform that lets you extend your business to mobile devices. It is designed to provide an open, comprehensive platform to build, run and manage HTML5, hybrid and native mobile apps.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds