Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

Обработка собственных секций в конфигурационном файле

В .Net повсеместно используются конфигурационные файлы. Самым знакомым примером для многих вероятно является Web.Config. По спецификации для добавления собственных конфигурационных элементов применяется тег . Простое средство, подходящее, в основном для случая конфигураций по типу «ключ-значение». Данная статья описывает средства .Net позволяющие создавать более сложные конфигурационные секции, а также методику, которая позволяет еще более упростить процесс обработки собственных конфигурационных

Вступление

В .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);
		}
	}
}

Вот таким вот нехитрым способом мы избавили себя от необходимости писать разбор собственной конфигурации.
 


Может пригодится:


Автор: Игорь Козлов
Прочитано: 3880
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру