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


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

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

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

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

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

Архитектура параметров приложения используется как в 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 и файлов.config пользователей будет отличаться в зависимости от того, как установлено приложение. Для приложения на основе Windows Forms, скопированного на локальный компьютер, app.exe.config будет находиться в том же каталоге, что и базовый каталог основного исполняемого файла приложения, а пользователя.config будет находиться в расположении, указанном свойством Application.LocalUserAppDataPath. Для приложения, установленного с помощью ClickOnce, оба этих файла будут находиться в каталоге данных ClickOnce под %InstallRoot%\Documents and Settings\имени пользователя\Local Settings.

Расположение хранилища этих файлов немного отличается, если пользователь включил перемещаемые профили, что позволяет пользователю определять различные параметры Windows и приложения при использовании других компьютеров в домене. В этом случае приложения ClickOnce и не ClickOnce будут иметь свои собственные файлы app.exe.config и .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 к тому же параметру, поставщик должен вызвать исключение и прекратить операцию.

См. также