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

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

< Лекция 8 || Лекция 9: 12345

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

If child.NodeType <> XmlNodeType.Comment And child.NodeType <> _
  XmlNodeType.Whitespace Then

Если узел не является комментарием или пробелом, оператор case проверяет имя узла и в зависимости от его значения выполняет определенное действие с узлом. Например, если узел называется "License", значение узла добавляется в Hashtable в ключ "License".

Для трех других типов узлов (принтеры, электронная почта и источники данных) оператор case вызывает внешний метод, так как для каждого узла возможно наличие нескольких значений. Для их обработки внешний метод создает для каждого из этих параметров Hashtable, который добавляется в Hashtable настроек. Ниже приведен метод ReadSection, который создает Hashtable, содержащий все значения для каждого раздела. Чтобы разместить все имена значений из каждого раздела, третий параметр определяет строку атрибутов значения, которые должны использоваться для каждого раздела.

C#

private Hashtable ReadSection(object parent, XmlNode section, string
  sValueAttribute)
{
  Hashtable parentConfig = (Hashtable) parent;
  Hashtable config;
  if (parentConfig != null)
  {
    config = (Hashtable) parentConfig.Clone();
  }
  else
  {
    config = new Hashtable();
  }
  foreach (XmlNode child in section.ChildNodes)
  {
    if(child.NodeType != XmlNodeType.Comment && child.NodeType !=
      XmlNodeType.Whitespace)
    {
      config[child.Attributes.GetNamedItem("name").Value] =
        child.Attributes.GetNamedItem(sValueAttribute).Va lue;
    }
  }
  return config;
}

VB.NET

Private Function ReadSection(parent As Object, section As XmlNode, _
  sValueAttribute as string) As Hashtable
  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
  Dim child As XmlNode
  For Each child In section.ChildNodes
    If child.NodeType <> XmlNodeType.Comment And _
      child.NodeType <>XmlNodeType.Whitespace Then
      config(child.Attributes.GetNamedItem("name").Value) = _
        child.Attributes.GetNamedItem(sValueAttribute).Value
    End If
  Next child
  Return config
End Function

Первая часть этого метода в точности совпадает с кодом метода Create. Она используется для наследования всех параметров, установленных в предыдущих разделах настроек. Оператор For перебирает все дочерние узлы раздела и добавляет значения в Hashtable. Затем этот Hashtable возвращается и добавляется в Hashtable, созданный в методе Create.

На этом обработчик раздела заканчивается, но было бы здорово предоставить класс, который осуществляет доступ к этим коллекциям. Ниже приведен код примера класса для доступа к данным коллекциям без вызова метода GetConfig.

C#

using System;
using System.Collections;
using System.Configuration;

namespace DNetReporting
{
  public class ConfigSettings
  {
    public static Hashtable Printers()
    {
      Hashtable config = GetConfig();
      return (Hashtable) config["Printers"];
    }

    public static Hashtable Emails()
    {
      Hashtable config = GetConfig();
      return (Hashtable) config["Emails"];
    }

    public static Hashtable DataSources()
    {
      Hashtable config = GetConfig();
      return (Hashtable) config["DataSources"];
    }

    public static string License()
    {
      Hashtable config = GetConfig();
      string sLicense = config["License"].ToString();
      return sLicense;
    }

    private static Hashtable GetConfig()
    {
      Hashtable configTable = (Hashtable)
        ConfigurationSettings.GetConfig("DNetReporting");
      return configTable;
    }
  }
}

VB.NET

Imports System
Imports System.Collections
Imports System.Configuration

Namespace DNetReporting

  Public Class ConfigSettings

    Public Shared Function Printers() As Hashtable
      Dim config As Hashtable = GetConfig()
      Return CType(config("Printers"), Hashtable)
    End Function

    Public Shared Function Emails() As Hashtable
      Dim config As Hashtable = GetConfig()
      Return CType(config("Emails"), Hashtable)
    End Function

    Public Shared Function DataSources() As Hashtable
      Dim config As Hashtable = GetConfig()
      Return CType(config("DataSources"), Hashtable)
    End Function

    Public Shared Function License() As String
      Dim config As Hashtable = GetConfig()
      Dim sLicense As String = config("License").ToString( )
      Return sLicense
    End Function

    Private Shared Function GetConfig() As Hashtable
      Dim configTable As Hashtable = _
        CType(ConfigurationSettings.GetConfig("DNetReport ing"), _
        Hashtable)
      Return configTable
    End Function
  End Class
End Namespace

Данный класс предоставляет несколько методов для доступа к объектам Hashtable, избавляя от необходимости работать напрямую с обработчиком раздела настроек. Например, если нужно заполнить значениями из Hashtable адресов электронной почты раскрывающийся список, то можно воспользоваться следующим кодом.

C#

Hashtable htEmail = ConfigSettings.Emails();
DropDownList2.DataTextField = "Key";
DropDownList2.DataValueField = "Value";
DropDownList2.DataSource = htEmail;
DropDownList2.DataBind();

VB.NET

Dim htEmail As Hashtable = ConfigSettings.Emails()
DropDownList2.DataTextField = "Key"
DropDownList2.DataValueField = "Value"
DropDownList2.DataSource = htEmail
DropDownList2.DataBind()

Данный код создает экземпляр Hashtable с адресами почты, а затем связывает его с раскрывающимся списком.

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

Ключевые моменты

  • Для создания простой коллекции собственных настроек можно использовать несколько обработчиков разделов настроек по умолчанию, включая SingleTagSectionHandler, NameValueFileSectionHandler и DictionarySectionHandler.
  • Для создания собственного обработчика раздела настроек можно использовать интерфейс IConfigurationSectionHandler.
  • Вы можете создать сложный обработчик раздела настроек, который использует несколько разделов и несколько объектов коллекций.
  • Чтобы избежать использования базы данных для хранения небольшого количества информации используйте собственные разделы настроек.
< Лекция 8 || Лекция 9: 12345
Геннадий Щербаков
Геннадий Щербаков

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