.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

  • This paper introduces IBM Java on the IBM PowerLinux 7R2 server and describes IBM's implementation of the Java platform, which includes IBM's Java Virtual Machine and development toolkit.

  • Targeted attacks and advanced threats are customized to infiltrate your unique IT infrastructure, evade conventional defenses, and remain hidden while stealing your corporate data. To detect these criminal intrusions, analysts and security experts agree that organizations should deploy advanced threat protection as part of an expanded security monitoring strategy. For this comparative analysis of breach detection systems, product analysis reports and comparative analysis reports are used to create the security …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds