Вступление
В .Net повсеместно используются конфигурационные файлы. Самым
знакомым примером для многих вероятно является Web.Config. По
спецификации для добавления собственных конфигурационных элементов
применяется тег <appSettings>. Простое средство, подходящее, в основном
для случая конфигураций по типу «ключ-значение». Данная статья описывает
средства .Net позволяющие создавать более сложные конфигурационные
секции, а также методику, которая позволяет еще более упростить процесс
обработки собственных конфигурационных секций.
Описание способа обработки собственных секций
Возьмем для примера следующую задачу: есть набор классов, инстанции
которых должны быть запущены в отдельных потоках и в зависимости от
настроек, рассылать сообщения по различным почтовым адресам и получать
ответы.
Для задания этих данных будем использовать следующую конфигурацию
Листинг 1. App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="BPSyncService" type="BPSyncService.runtime.configuration.Configuration, BPSyncService">
</section>
</configSections>
<BPSyncService>
<Process>
<ProcessClass>BPSyncService.runtime.Forecast</ProcessClass>
<RequestConnection>request_forecast@some.net</RequestConnection>
<ResponseConnection>response_forecast@some.net</ResponseConnection>
<Scheduler>
<StartTime>2004-09-19T00:00:00</StartTime>
<Period>10</Period>
</Scheduler>
</Process>
<Process>
<ProcessClass>BPSyncService.runtime.Fact</ProcessClass>
<RequestConnection>request_fact@some.net</RequestConnection>
<ResponseConnection>response_fact@some.net</ResponseConnection>
<Scheduler>
<StartTime>2004-09-19T10:00:00</StartTime>
<Period>10</Period>
</Scheduler>
</Process>
</BPSyncService>
</configuration>
Стандартными тегами здесь являются <configuration>,
<configSections>
и <section>.
Тег <section
name="BPSyncService"
type="BPSyncService.runtime.configuration.Configuration,
BPSyncService"></section>
задает класс обработчик для секции <BPSyncService>......</BPSyncService>.
Данный класс должен объявлять интерфейс
System.Configuration.IConfigurationSectionHandler и переопределять
функцию этого интерфейса
object Create(
object parent,
object configContext,
XmlNode section ).
В данном методе нас интересует в основном параметр XmlNode section,
это собственно и является тегом <BPSyncService>......</BPSyncService>.
Остается немного, просто разобрать нашу конфигурацию пробегаясь по
веткам XML дерева. Вот здесь можно пойти немного дальше и
превратить всю конфигурацию в нашу собственную объектную модель.
Листинг 2.
using System;
using System.Configuration;
using System.Xml;
using System.Xml.Serialization;
namespace BPSyncService.runtime.configuration
{
public class Configuration : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, XmlNode section)
{
XmlReader reader = new XmlNodeReader(section);
XmlSerializer serializer = new XmlSerializer(typeof(BPSyncService));
BPSyncService bpSyncService = (BPSyncService) serializer.Deserialize(reader);
return bpSyncService;
}
}
[Serializable]
public class BPSyncService
{
private Process[] process;
[XmlElement(ElementName="")]
public Process[] Process
{
get { return process; }
set { process = value; }
}
}
[Serializable]
public class Process
{
private string processClass;
private string requestConnection;
private string responseConnection;
private Scheduler scheduler;
public string ProcessClass
{
get { return processClass; }
set { processClass = value; }
}
public string RequestConnection
{
get { return requestConnection; }
set { requestConnection = value; }
}
public string ResponseConnection
{
get { return responseConnection; }
set { responseConnection = value; }
}
public Scheduler Scheduler
{
get { return scheduler; }
set { scheduler = value; }
}
}
[Serializable]
public class Scheduler
{
private DateTime startTime;
private int period;
public DateTime StartTime
{
get { return startTime; }
set { startTime = value; }
}
public int Period
{
get { return period; }
set { period = value; }
}
}
class Test
{
[STAThread]
static void Main(string[] args)
{
BPSyncService bpSyncService = (BPSyncService) ConfigurationSettings.GetConfig("BPSyncService");
// Здесь у нас уже готовый объект BPSyncService
Console.Write(bpSyncService);
}
}
}
Вот таким вот нехитрым способом мы избавили себя от необходимости
писать разбор собственной конфигурации.
|