Поделиться через


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

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

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

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

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

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

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

  • Поддержка параметров пользователей

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

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

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

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

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

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
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;
        }
    }
}

Сохранение параметров

Сам по себе класс 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, где user является именем пользователя, выполняющего в данный момент приложение. Значение по умолчанию для параметра пользователя можно указать с помощью атрибута 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 и 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 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
public override string ApplicationName
{
    get
    {
        return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    set
    {
        // Do nothing.
    }
}

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

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

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

Imports System.Configuration

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

    ' Implementation goes here.
End Class
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace ApplicationSettingsArchitectureCS
{
    class CustomSettings : ApplicationSettingsBase
    {
        // Implementation goes here.
    }
}

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

Важно!

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

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

См. также

Ссылки

Схема параметров приложения

ApplicationSettingsBase

SettingsProvider

LocalFileSettingsProvider

Основные понятия

Общие сведения о параметрах приложений

Параметры приложения для пользовательских элементов управления

ClickOnce и параметры приложения