Опубликован: 24.01.2007 | Доступ: свободный | Студентов: 1253 / 82 | Оценка: 4.37 / 4.17 | Длительность: 14:27:00
ISBN: 978-5-94774-627-3
Лекция 9:

Создание собственных параметров

< Лекция 8 || Лекция 9: 12345
Создание собственного сложного обработчика раздела

Простой обработчик раздела бывает полезен, но иногда возникают ситуации, когда требуется сохранять не только простые значения. Используя собственный обработчик раздела, можно сохранять большое количество параметров в объектах коллекций или возвратить совершенно другой тип объекта. Ниже мы рассмотрим, как использовать один раздел для хранения нескольких групп параметров, а также как использовать эти параметры для предоставления объектов для других классов.

В следующих примерах мы создадим раздел настроек для вымышленного веб-приложения. Это приложение называется DNetReporting; оно создает отчеты на основе различных источников данных, а затем либо печатает эти отчеты, либо передает их по электронной почте. Для хранения нескольких настроечных параметров приложения задействуем разделы настроек, а также обработчики разделов и другие классы. Первый шаг состоит в создании раздела настроек, который включает несколько используемых параметров.

<DNetReporting>
  <License key="b12gfdt32d2" />
  <DataSources>
    <DataSource name="Employee Database" connstring="" />
    <DataSource name="Sales Database" connstring="" />
  </DataSources>
  <Emails>
    <Email name="James Avery" address="javery@infozerk.com" />
    <Email name="Accountants" address="accounts@infozerk.com" />
  </Emails>
  <Printers>
    <Printer name="IT Printer" localname="HP Deskjet 1200" />
    <Printer name="HR Printer" localname="HP Deskjet 4050" />
  </Printers>
</DNetReporting>

Данный раздел настроек хранит ключ лицензии приложения, все источники данных, адреса электронной почты и принтеры. Следующий шаг заключается в создании записи для этого раздела настроек в разделе <configSections>.

<configSections>
  <section name="DNetReporting"
    type="DNetReporting.ConfigHandler, DNetReporting"/>
</configSections>

Теперь мы создадим обработчик раздела, считывающий эти параметры из настроечного файла. Ниже приведен код основной части обработчика раздела, сильно напоминающий обработчик раздела, созданный ранее.

C#

using System;
using System.Data;
using System.Data.SqlClient;
using System.XML;
using System.Configuration;

namespace DNetReporting
{
  public class ConfigHandler : IConfigurationSectionHandler
  {
    public object Create(object parent, object configContext,
      XmlNode section)
    {
      string sHomePage;
      sHomePage = section.Attributes.Item[0].Value;
      return sHomePage;
    }
  }
}

VB.NET

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.XML
Imports System.Configuration

Namespace DNetReporting
  Public Class ConfigHandler
    Implements IConfigurationSectionHandler
    Public Function Create(parent As Object, configContext As _
      Object, section As XmlNode) As Object Implements _
      IConfigurationSectionHandler.Create
      Dim sHomePage As String
      sHomePage = section.Attributes.Item(0).Value
      Return sHomePage
    End Function
  End Class
End Namespace

Обработчик раздела настроек должен иметь возможность унаследовать все родительские настроечные параметры. Первый параметр типа object, который называется parent, содержит параметры, наследуемые этим обработчиком. Мы сохраняем параметры в объекте Hashtable, так что через объект parent будет передаваться именно этот объект. Ниже приведен код, который следует добавить в метод Create, чтобы реализовать наследование данных.

C#

Hashtable parentConfig = (Hashtable) parent;
Hashtable config;
if (parentConfig != null)
{
  config = (Hashtable) parentConfig.Clone();
}
else
{
  config = new Hashtable();
}

VB.NET

Dim parentConfig As Hashtable = CType(parent, Hashtable)
Dim config As Hashtable
If Not (parentConfig Is Nothing) Then
  config = CType(parentConfig.Clone(), Hashtable)
Else
  config = New Hashtable()
End If

Первая строка кода преобразует тип объекта parent к типу Hashtable. Вторая строка создает Hashtable, в котором будут храниться параметры. Оператор If, с которого начинается третья строка кода, проверяет, равен ли parentConfig типа Hashtable значению null. Если Hashtable существует, то имеются параметры, которые должны быть унаследованы новым набором параметров. Если родительский Hashtable существует, то новый Hashtable будет клоном родительского Hashtable ; если родительский Hashtable не существует, то будет создан новый Hashtable.

Следующим шагом в создании собственного обработчика раздела является перебор всех элементов XML и определение того, что следует делать с различными подразделами и элементами. Ниже приведен код для перебора всех элементов XML этого раздела.

C#

foreach (XmlNode child in section.ChildNodes)
{
  if(child.NodeType != XmlNodeType.Comment && child.NodeType !=
    XmlNodeType.Whitespace)
  {
    switch (child.Name)
    {
    case "License":
      config["License"] = child.Attributes.Item(0).Value;
      break;

    case "DataSources":
      config["DataSources"] = ReadSection(
      config["DataSources"], child, "connstring");
      break;

    case "Emails":
      config["Emails"] = ReadSection(config["Emails"], child,
      "address");
      break;

    case "Printers":
      config["Printers"] = ReadSection(config["Printers"],
      child, "localname");
      break;
    }
  }
}

VB.NET

Dim child As XmlNode
For Each child In section.ChildNodes
  If child.NodeType <> XmlNodeType.Comment And child.NodeType <> _
    XmlNodeType.Whitespace Then
    Select Case child.Name
    Case "License"
      config("License") = child.Attributes.Item(0).Value

    Case "DataSources"
      config("DataSources") = ReadSection( _
        config("DataSources"), child, "connstring")

    Case "Emails"
      config("Emails") = ReadSection(config("Emails"), _
        child, "address")

    Case "Printers"
      config("Printers") = ReadSection(config("Printers "), _
        child, "localname")
    End Select
  End If
Next child
< Лекция 8 || Лекция 9: 12345
Геннадий Щербаков
Геннадий Щербаков

В начале года получил код dreamspark  H4RQ9-QJ6FD-YJWJT-P6FVF-HGXQZ. При  его вводе- сообщение что он просрочен.