A very familiar way of implementing the frequently changing value in an application is by storing them in a configuration file’s <appSettings> section. When the project is big, storing too many values in application settings is not a suggested approach, as this can lead to confusions and many other integration problems. Many at times we have seen when the code is moved from a development environment to a production environment there is a mismatch in the the configuration or we loose out on some important values. These issues can be eliminated by simply using a custom configuration section. A project constitutes of many modules and each module will have configuration values specific to them. So it will be a good idea to group them to a single section, and every module’s configuration values will reside in their respective section. This way by just looking at the configuration one can figure out which value relates to what module. It is also suggested to have a common section so that these values can be accessed by all the modules and will reduce duplication of values.
Going forward you will learn about creating custom configuration section, the corresponding value holder class, and properties to access them through out the application. I will make the demo simple to a console application, so that it is easy to understand.
Start a new Console application and add an application configuration file to it. Also reference System.Configuration.dll.
What’s in the Configuration?
Lets break this into bits and pieces. Notice the <configSections> element –this is where you register your custom configuration. To add a custom configuration – add an element <section name=”” type=””/>.
- name – represents the name of the custom configuration
- type – used as <namespace.Type>, <AssemblyName> (Type is the corresponding class which inherits ConfigurationSection)
And the <MyConfiguration>element is nothing but the custom configuration section which contains custom values stored. I will explain multiple ways of storing in the config files and accessing them from the application. In the config, I store some values as the attribute of the main element, the main element has the sub element <Messages> and that in turn has the collection of <Messages> having attributes “Name” and “Value”. This can be easily related to <add> element in the <appSettings>.
What’s in the Code?
Now let us go ahead and build the classes for accessing these values in the application.
- There should be a class in the application representing each element (including the sub elements) in the configuration file.
- Class holding the custom Configuration Section should inherit from CustomSection
- public class MyConfiguration : ConfigurationSection
- The attributes/elements can be represented as a property which is of type ConfigurationProperty in the parent class.
- Class representing an element collection should inherit from ConfigurationElementCollection
- public class MessageCollection : ConfigurationElementCollection
- Class representing an element should inherit from ConfigurationElement
- public class MessageElement : ConfigurationElement
Since <Message> is the last child element, write the corresponding class for it first, and then <Messages> which is its parent and it holds the collection of <Messages> and finally the class for <MyConfiguration> which has attributes represented as properties in itself.
Element: <Message> – Class: MessageElement
- <Message> element has attributes “name” and “value” which are represented as ConfigurationProperty and its initialization takes the following parameters
- name: The name of the configuration entity.
- type: The type of the configuration entity.
- defaultValue: The default value of the configuration entity.
- options: One of the System.Configuration.ConfigurationPropertyOptions enumeration values
- In the constructor add these properties to the base class Property Collection
- Expose them as public property
Element: <Messages> – Class: MessageCollection
- MessageCollection class is inherited from the abstract class ConfigurationElementCollection and two of its abstract methods CreateElement() and GetElementKey() needs to be overridden
- CreateElement() creates the new instance of the MessageElement
- GetElementKey() Gets the element key for a Message element (we define Name attribute as the key, so that the value can be retrieved using the name)
- new public MessageElement this[string name] – add this to retrieve the value with the key name. For e.g: ConfigurationManager.AppSettings[“test”];
Element: <MyConfiguration> – Class: MyConfiguration (Putting them all together[ConfigurationSection ])
- Add all the Attributes and Elements as the ConfigurationProperty of corresponding type.
And the Program.cs
Above code snippet is self explanatory.
I hope I was able to walk you through a step by step process of a developing hello world Custom Configuration section.