Архитектура параметров приложения
В этом разделе описываются принципы работы архитектуры параметров приложения и рассматриваются дополнительные возможности архитектуры, такие как сгруппированные параметры и ключи параметров.
Архитектура параметров приложений позволяет определять строго типизированные параметры с областью приложения или пользователя и сохраняет параметры в сеансах приложения. Архитектура предоставляет механизм сохраняемости по умолчанию для сохранения параметров и их загрузки из локальной файловой системы. Она также определяет интерфейсы для предоставления пользовательских механизмов сохраняемости.
Эти интерфейсы позволяют пользовательским компонентам сохранять свои параметры, когда они размещаются в приложении. Благодаря ключам параметров компоненты могут раздельно хранить параметры для нескольких экземпляров компонента.
Определение параметров
Архитектура параметров приложения используется внутри 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 нужно сохранить параметры на диске, он выполняет следующие действия:
Путем применения операции отражения проверяются все свойства, определенные на основе производного класса ApplicationSettingsBase, при этом находятся те из них, которые применяются с помощью класса ApplicationScopedSettingAttributeили UserScopedSettingAttribute.
Сериализует свойство на диск. Сначала выполняется попытка вызвать метод ConvertToString или ConvertFromString на основе класса TypeConverter, привязанного к типу. Если это не удается, использует XML-сериализацию.
Распределяет параметры по файлам на основе атрибута параметра.
При реализации собственного класса параметров можно использовать класс 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 к одному и тому же параметру, поставщик должен вызывать исключение и прекращать операцию.
См. также
.NET Desktop feedback