In this article, we will look into the usage of Custom Section Handler by the help of IConfigurationSectionHandler.
Introduction
Sometimes we may need to create our own section handler in the .config file for which we need the help of IConfigurationSectionHandler.
This interface handles the access to certain configuration sections.It has only one method "Create" whose signature is as under
object Create(object parent, object configContext, XmlNode section);
The method is responsible for creating a configuration section handler.
This article will show us how to do so with a simple example
Straight to Experiment
Let us create a class say "FileFormat" and expose the below properties
namespace IConfigurationSectionHandlerDemo
{
public class FileFormat
{
public string TableRegex { set; get; }
public string ProcedureRegex { set; get; }
public string FunctionRegex { set; get; }
public string ViewRegex { set; get; }
}
}
Next create a config entry as under
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="FileFormat" type="IConfigurationSectionHandlerDemo.FileFormatHandler,IConfigurationSectionHandlerDemo"/>
</configSections>
<FileFormat>
<TableRegex>
<![CDATA[^(?:(dbo|test)\.)([[a-zA-Z0-9_]+)(\.(table)+)(\.(sql)$)]]>
</TableRegex>
<ProcedureRegex>
<![CDATA[^(?:(dbo|test)\.)([[a-zA-Z0-9_]+)(\.(storedprocedure)+)(\.(sql)$)]]>
</ProcedureRegex>
<FunctionRegex>
<![CDATA[^(?:(dbo|test)\.)([[a-zA-Z0-9_]+)(\.(userdefinedfunction)+)(\.(sql)$)]]>
</FunctionRegex>
<ViewRegex>
<![CDATA[^(?:(dbo|test)\.)([[a-zA-Z0-9_]+)(\.(view)+)(\.(sql)$)]]>
</ViewRegex>
</FileFormat>
</configuration>
Next create a class name "FileFormatHandler" that implements "IConfigurationSectionHandler" interface.This class is responsible to reading the custom config values.
using System.Configuration;
using System.Xml;
namespace IConfigurationSectionHandlerDemo
{
public class FileFormatHandler : IConfigurationSectionHandler
{
public object Create(object parent, object configuration, XmlNode node)
{
FileFormat fileFormatObject = new FileFormat();
XmlNodeList fileFormatNodes = node.SelectNodes("/FileFormat");
if (fileFormatNodes == null) return null;
XmlElement sqlElement = fileFormatNodes[0] as XmlElement;
if (sqlElement == null) return fileFormatObject;
for (int item = 0; item < sqlElement.ChildNodes.Count; item++)
{
XmlElement xmlElement = sqlElement.ChildNodes[item] as XmlElement;
if (xmlElement == null) continue;
switch (xmlElement.Name)
{
case "TableRegex":
fileFormatObject.TableRegex = xmlElement.InnerText;
break;
case "ProcedureRegex":
fileFormatObject.ProcedureRegex = xmlElement.InnerText;
break;
case "FunctionRegex":
fileFormatObject.FunctionRegex = xmlElement.InnerText;
break;
case "ViewRegex":
fileFormatObject.ViewRegex = xmlElement.InnerText;
break;
default: break;
}
}
return fileFormatObject;
}
}
}
The "XMLNode" in the "Create" method contains information about the XML node section.We can get the information about the various "FileFormats" from the "ChildNodes" property
Then for every node, get the element and from there get the name.Inside the switch case, after finding the match, get the value from the innertext of the element.
Please note that, the section "type" value in configuration file is
type="namespace.classname,namespace"
Finally, we need to invoke and test it.
static void Main(string[] args)
{
try
{
var fileFormatValues = ConfigurationManager.GetSection("FileFormat") as FileFormat;
var SPRegexValue = fileFormatValues.ProcedureRegex;
var input = "dbo.mystoredprocedure.storedprocedure.sql";
var result = Regex.IsMatch(input, SPRegexValue, RegexOptions.IgnoreCase);
}
catch(Exception ex)
{
throw ex;
}
}
First we are obtaining all the fileFormat value from the "FileFormat" config section by using
ConfigurationManager.GetSection("FileFormat") as FileFormat
Then we are getting the regular expression value for the Store Procedure as under
var SPRegexValue = fileFormatValues.ProcedureRegex;
Finally we are checking if the supplied value matched with the Store Procedure regular expression or not.
Conclusion
Hope we have understood the concept of dealing with a Custom Section Handler with the help of IConfigurationSectionHandler interface.Hope this will be useful.Thanks for reading.Zipped file is attached.