Архитектура параметров приложения

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

Архитектура параметров приложений позволяет определять строго типизированные параметры с областью приложения или пользователя и сохраняет параметры в сеансах приложения. Архитектура предоставляет механизм сохраняемости по умолчанию для сохранения параметров и их загрузки из локальной файловой системы. Она также определяет интерфейсы для предоставления пользовательских механизмов сохраняемости.

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

Определение параметров

Архитектура параметров приложения используется внутри ASP.NET и Windows Forms и содержит ряд базовых классов, которые являются общими для обеих сред. Наиболее важным является класс SettingsBase, который предоставляет как доступ к параметрам через коллекцию, так и низкоуровневые методы для загрузки и сохранения параметров. Каждая среда реализует свой собственный класс, производный от класса SettingsBase, с целью обеспечения дополнительных функциональных возможностей для работы с параметрами в данной среде. В приложении на основе Windows Forms все параметры должны быть определены в классе, производном от класса ApplicationSettingsBase, который добавляет следующие функции базовому классу:

  • Операции загрузки и сохранения более высокого уровня

  • Поддержка параметров области пользователя

  • Возврат для параметров пользователя предопределенных значений по умолчанию

  • Обновление параметров из предыдущей версии приложения

  • Проверка параметров, либо до их изменения, либо до их сохранения

Для описания параметров можно использовать атрибуты, определенные в пространстве имен System.Configuration; они описаны в статье Атрибуты параметров приложения. При определении параметра его нужно применять с указанием класса ApplicationScopedSettingAttribute или UserScopedSettingAttribute, что обуславливает применимость этого параметра ко всему приложению или только к текущему пользователю.

В следующем примере кода определяется пользовательский класс параметров с одним параметром BackgroundColor.

using System;
using System.Configuration;
using System.Drawing;

public class MyUserSettings : ApplicationSettingsBase
{
    [UserScopedSetting()]
    [DefaultSettingValue("white")]
    public Color BackgroundColor
    {
        get
        {
            return ((Color)this["BackgroundColor"]);
        }
        set
        {
            this["BackgroundColor"] = (Color)value;
        }
    }
}
Imports System.Configuration

Public Class MyUserSettings
    Inherits ApplicationSettingsBase
    <UserScopedSetting()> _
    <DefaultSettingValue("white")> _
    Public Property BackgroundColor() As Color
        Get
            BackgroundColor = Me("BackgroundColor")
        End Get

        Set(ByVal value As Color)
            Me("BackgroundColor") = value
        End Set
    End Property
End Class

Сохраняемость параметров

Класс ApplicationSettingsBase сам по себе не сохраняет или не загружает параметры; эта задача передается поставщику параметров, а именно классу, производному от SettingsProvider. Если класс, производный от ApplicationSettingsBase, не определяет поставщика параметров через SettingsProviderAttribute, тогда используется поставщик по умолчанию: LocalFileSettingsProvider.

Система конфигурации, которая была первоначально выпущена с .NET Framework, поддерживает предоставление статических данных конфигурации приложения через файл machine.config локального компьютера или в файле app.exe.config, развертываемого вместе с приложением. Класс LocalFileSettingsProvider расширяет эту изначальную поддержку следующим образом:

  • Параметры области приложения могут храниться в файле machine.config или app.exe.config. Файл machine.config всегда предназначен только для чтения, тогда как app.exe.config для большинства приложений рекомендуется использовать только для чтения с точки зрения безопасности.

  • Параметры области пользователя могут храниться в файлах app.exe.config. В этом случае они обрабатываются как статические значения по умолчанию.

  • Параметры, область пользователей, не используемые по умолчанию, хранятся в новом файле user.config. Можно указать значение по умолчанию для параметра область пользователя.DefaultSettingValueAttribute Так как параметры, область пользователей, часто изменяются во время выполнения приложения, user.config всегда считывается и записывается. Дополнительные сведения см. в разделе "Где хранятся параметры область пользователя".

Во всех трех файлах конфигурации параметры хранятся в формате XML. Элементом XML верхнего уровня для параметров области приложения является <appSettings>, а <userSettings> используется для параметров области пользователя. Файл app.exe.config, содержащий как параметры области приложения, так и значения по умолчанию для параметров области пользователя, выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </sectionGroup>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="Cursor" serializeAs="String">
                <value>Default</value>
            </setting>
            <setting name="DoubleBuffering" serializeAs="String">
                <value>False</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </applicationSettings>
    <userSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="FormTitle" serializeAs="String">
                <value>Form1</value>
            </setting>
            <setting name="FormSize" serializeAs="String">
                <value>595, 536</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </userSettings>
</configuration>

Определение элементов в разделе параметров приложения файла конфигурации см. в разделе Схема параметров приложения.

Привязки параметров

Параметры приложения используют архитектуру привязки данных Windows Forms для обеспечения двустороннего обмена обновлениями параметров между объектом параметров и компонентами. Если для создания параметров приложения и их назначения свойствам компонентов используется Visual Studio, эти привязки создаются автоматически.

Параметр приложения можно привязать только к тому компоненту, который поддерживает интерфейс IBindableComponent. Кроме того, компонент должен реализовывать событие изменения для конкретного свойства привязки или уведомлять параметры приложений об изменении свойства с помощью интерфейса INotifyPropertyChanged. Если компонент не реализует интерфейс IBindableComponent и привязка выполняется с помощью Visual Studio, то свойства привязки будут установлены в первый раз, но не будут обновляться. Если компонент реализует интерфейс IBindableComponent, но не поддерживает уведомления об изменении свойств, привязка не будет обновляться в файле параметров при изменении свойства.

Некоторые компоненты Windows Forms, такие как ToolStripItem, не поддерживают привязки параметров.

Сериализация параметров

Когда классу LocalFileSettingsProvider нужно сохранить параметры на диске, он выполняет следующие действия:

  1. Путем применения операции отражения проверяются все свойства, определенные на основе производного класса ApplicationSettingsBase, при этом находятся те из них, которые применяются с помощью класса ApplicationScopedSettingAttributeили UserScopedSettingAttribute.

  2. Сериализует свойство на диск. Сначала выполняется попытка вызвать метод ConvertToString или ConvertFromString на основе класса TypeConverter, привязанного к типу. Если это не удается, использует XML-сериализацию.

  3. Распределяет параметры по файлам на основе атрибута параметра.

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

Расположение файлов параметров

Расположение файлов app.exe.config и user.config зависит от способа установки приложения. Для приложения на основе Windows Forms, скопированного на локальный компьютер, файл app.exe.config будет находиться в том же каталоге, что и базовый каталог основного исполняемого файла приложения, а файл user.config будет находиться в расположении, заданном свойством Application.LocalUserAppDataPath. Для приложения, установленного с помощью ClickOnce, оба этих файла будут находиться в каталоге данных ClickOnce, который находится в каталоге %InstallRoot%\Documents and Settings\имя_пользователя\Local Settings.

Место хранения этих файлов будет другим, если пользователь включил перемещаемые профили, что позволит ему определять разные настройки Windows и приложения в случае использования им других компьютеров в домене. В этом случае для приложений ClickOnce и не ClickOnce их файлы app.exe.config и user.config будут находиться в каталоге %InstallRoot%\Documents and Settings\имя_пользователя\Application Data.

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

Параметры приложения и безопасность

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

При использовании параметров приложения в приложении ClickOnce файл user.config хранится в каталоге данных ClickOnce. Размер файла user.config приложения не может превышать квоту каталога данных, заданную в ClickOnce. Дополнительные сведения см. в разделе ClickOnce и параметры приложения.

Поставщики пользовательских настроек

В архитектуре параметров приложений между классом-оболочкой параметров приложения, производной от ApplicationSettingsBase, и связанными с ней поставщиками параметров, производными от SettingsProvider, существует слабая связь. Эта связь определяется только классом SettingsProviderAttribute, применяемым к классу-оболочке или его отдельным свойствам. Если поставщик параметров явно не задан, используется поставщик по умолчанию LocalFileSettingsProvider. В результате такая архитектура позволяет создавать и использовать поставщиков настраиваемых параметров.

Предположим, что требуется разработать и использовать SqlSettingsProvider, то есть поставщика, который будет хранить все данные параметров в базе данных Microsoft SQL Server. Класс, производный от SettingsProvider, должен получать эту информацию в своем методе Initialize в качестве параметра типа System.Collections.Specialized.NameValueCollection. После этого нужно реализовать метод GetPropertyValues для получения параметров из хранилища данных, а также метод SetPropertyValues для их сохранения. Поставщик может использовать класс SettingsPropertyCollection, добавленный к методу GetPropertyValues для определения имени, типа и области применения свойства, а также для любых других атрибутов параметров, определенных для этого свойства.

Вашему поставщику будет необходимо реализовать одно свойство и один метод, реализация которых может оказаться сложной. Свойство ApplicationName является абстрактным свойством класса SettingsProvider; в программном коде это свойство должно возвращать следующее значение:

public override string ApplicationName
{
    get
    {
        return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    set
    {
        // Do nothing.
    }
}
Public Overrides Property ApplicationName() As String
    Get
        ApplicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
    End Get
    Set(ByVal value As String)
        ' Do nothing.
    End Set
End Property

Ваш производный класс также должен реализовать метод Initialize, который не принимает аргументы и не возвращает значения. Этот метод не определяется классом SettingsProvider.

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

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

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace ApplicationSettingsArchitectureCS
{
    [SettingsProvider("SqlSettingsProvider")]
    class CustomSettings : ApplicationSettingsBase
    {
        // Implementation goes here.
    }
}
Imports System.Configuration

<SettingsProvider("SqlSettingsProvider")> _
Public Class CustomSettings
    Inherits ApplicationSettingsBase

    ' Implementation goes here.
End Class

Поставщик можно вызывать одновременно из нескольких потоков, но он всегда будет выполнять запись данных в одно место хранения. Таким образом, архитектура параметров приложения будет всегда создавать только один экземпляр класса поставщика.

Важно!

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

Поставщику не нужно поддерживать все атрибуты параметров, определенные в пространстве имен System.Configuration, но как минимум должна обеспечиваться поддержка классов ApplicationScopedSettingAttribute и UserScopedSettingAttribute, а также DefaultSettingValueAttribute. Для тех атрибутов, которые он не поддерживает, поставщик должен завершаться ошибкой без уведомления. Он не должен создавать исключение. Если в классе параметров используется недопустимое сочетание атрибутов, например применение ApplicationScopedSettingAttribute и UserScopedSettingAttribute к одному и тому же параметру, поставщик должен вызывать исключение и прекращать операцию.

См. также