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

Изучение архитектуры настроек ASP.NET

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Данный обработчик проверяет, имеется ли свойство file=", а затем, если это свойство пустое, возвращает значение, основанное на вызове метода NameValueSectionHandler.CreateStatic(). Это метод, создающий объект конфигурации. Ниже приведен код NameValueSectionHandler.

//———————————————————————————––––––––––––——————
//  <copyright file="NameValueSectionHandler.cs" company="Microsoft">
//
//  Copyright (c) 2002 Microsoft Corporation All rights reserved.
//  The use and distribution terms for this software are contained in the
//  file named license.txt, which can be found in the root of this
//  distribution. By using this software in any fashion, you are agreeing
//  to be bound by the terms of this license
//  You must not remove this notice, or any other, from this software.
//
//  </copyright>
//——————————––––––––––––———————————————————————
#if !LIB
namespace System.Configuration {
using System.Collections;
using System.Collections.Specialized;
using System.Xml;
using System.Globalization;
public class NameValueSectionHandler :
IConfigurationSectionHandler {
const string defaultKeyAttribute = "key";
const string defaultValueAttribute = "value";
public object Create(object parent, object context,
XmlNode section) {
return CreateStatic(parent, section, KeyAttributeName,
  ValueAttributeName);
}
internal static object CreateStatic(object parent,
XmlNode section) {
return CreateStatic(parent, section, defaultKeyAttribute,
  defaultValueAttribute);
}
internal static object CreateStatic(object parent, XmlNode
section, string keyAttriuteName, string valueAttributeName)
{
ReadOnlyNameValueCollection result;
//  start result off as a shallow clone of the parent
if (parent == null)
  result = new ReadOnlyNameValueCollection(new
  CaseInsensitiveHashCodeProvider(
  CultureInfo.InvariantCulture),
  new  CaseInsensitiveComparer(
  CultureInfo.InvariantCulture));
else {
  ReadOnlyNameValueCollection parentCollection =
  (ReadOnlyNameValueCollection)parent;
  result =
  new ReadOnlyNameValueCollection(parentCollection);
}
// process XML
HandlerBase.CheckForUnrecognizedAttributes(section);
foreach (XmlNode child in section.ChildNodes) {
  // skip whitespace and comments
  if (HandlerBase.IsIgnorableAlsoCheckForNonElement(
  child))
  continue;
  // handle <set>, <remove>, <clear> tags
  if (child.Name == "add") {
  String key = HandlerBase.RemoveRequiredAttribute(
    child, keyAttriuteName);
  String value = HandlerBase.RemoveRequiredAttribute(
    child, valueAttributeName, true
    /*allowEmptyString*/);
  HandlerBase.CheckForUnrecognizedAttributes(child);
  result[key] = value;
  }
  else if (child.Name == "remove") {
  String key = HandlerBase.RemoveRequiredAttribute(
    child, keyAttriuteName);
  HandlerBase.CheckForUnrecognizedAttributes(child);
  result.Remove(key);
  }
  else if (child.Name.Equals("clear")) {
  HandlerBase.CheckForUnrecognizedAttributes(child);
  result.Clear();    }
  else {
  HandlerBase.ThrowUnrecognizedElement(child);
  }
}
result.SetReadOnly();
return result;
}
protected virtual string KeyAttributeName {
get { return defaultKeyAttribute;}
}
protected virtual string ValueAttributeName {
get { return defaultValueAttribute;}
}
}
}
#endif

Данный код создает объект коллекции настроек, содержащий пары различных ключей и значений из раздела настроек <appSettings>. Я не буду тратить много времени на объяснение кода обработчика, но давайте рассмотрим несколько наиболее важных пар. Метод CreateStatic() вызывается из первого обработчика раздела и создает объект конфигурации ReadOnlyNameValueCollection, который будет хранить всю информацию о парах различных ключей и значений. Давайте посмотрим на код, который используется для разбора XML.

if (child.Name == "add") {
String key = HandlerBase.RemoveRequiredAttribute(child,
keyAttriuteName);
String value = HandlerBase.RemoveRequiredAttribute(child,
valueAttributeName, true/*allowEmptyString*/);
HandlerBase.CheckForUnrecognizedAttributes(child);
result[key] = value;
}

Если имя дочернего элемента XML равно " add ", то этот код добавляет в объект типа ReadOnlyNameValueCollection с именем result пару ключ/значение. Когда вы в своем коде ссылаетесь на коллекцию <appSettings>, то осуществляете доступ к этой коллекции и обращаетесь к значениям, сохраненным в этом разделе.

Обработчики разделов настроек интерпретируют все параметры из конкретных разделов и делают их доступными для приложений. В "Создание собственных параметров" описывется, как создавать собственные обработчики разделов настроек для интерпретации параметров из собственных разделов.

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

  • Иерархическая модель настроек организует различные виды наследования от сервера к приложению и от одного приложения к другому. Это наследование основано на URL, который используется для доступа к требуемому ресурсу.
  • Для указания того, что настроечные параметры относятся к конкретной директории или даже одному файлу, используется тег location.
  • Для запрета переопределение параметров другими файлами web.config используется параметр allowOverride.
  • Обработчики разделов настроек делают настройки конфигурации доступными для приложений, обрабатывая XML и возвращая объект конфигурации.
< Лекция 1 || Лекция 2: 1234 || Лекция 3 >
Геннадий Щербаков
Геннадий Щербаков

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