Архитектура параметров приложения
В этом разделе описывается, как работает архитектура параметров приложения и рассматриваются дополнительные функции архитектуры, такие как сгруппированные параметры и ключи параметров.
Архитектура параметров приложения поддерживает определение строго типизированных параметров с помощью приложения или области пользователя и сохранение параметров между сеансами приложения. Архитектура предоставляет механизм сохраняемости по умолчанию для сохранения параметров и их загрузки из локальной файловой системы. Архитектура также определяет интерфейсы для предоставления пользовательского обработчика сохраняемости.
Интерфейсы предоставляются, позволяющие пользовательским компонентам сохранять собственные параметры при размещении в приложении. С помощью ключей параметров компоненты могут хранить параметры для нескольких экземпляров компонента отдельно.
Определение параметров
Архитектура параметров приложения используется как в 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 и файлов.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 к тому же параметру, поставщик должен вызвать исключение и прекратить операцию.
См. также
.NET Desktop feedback