Архитектура параметров приложения
В этом разделе описываются принципы работы архитектуры параметров приложения и рассматриваются дополнительные возможности архитектуры, такие как сгруппированные параметры и ключи параметров.
Архитектура параметров приложений позволяет определять строго типизированные параметры с областью приложения или пользователя и сохраняет параметры в сеансах приложения. Архитектура предоставляет механизм сохраняемости по умолчанию для сохранения параметров и их загрузки из локальной файловой системы. Она также определяет интерфейсы для предоставления пользовательских механизмов сохраняемости.
Эти интерфейсы позволяют пользовательским компонентам сохранять свои параметры, когда они размещаются в приложении. Благодаря ключам параметров компоненты могут раздельно хранить параметры для нескольких экземпляров компонента.
Определение параметров
Архитектура параметров приложения используется внутри 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;
}
}
}
Сохраняемость параметров
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. В этом случае они обрабатываются как статические значения по умолчанию.Параметры области пользователя не по умолчанию хранятся в новом файле — пользователь.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 будет находиться в той же папке, что базовый каталог основного исполняемого файла приложения, и пользователя.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.
}
}
Ваш производный класс также должен реализовать метод 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.
}
}
Поставщик можно вызывать одновременно из нескольких потоков, но он всегда будет выполнять запись данных в одно место хранения. Таким образом, архитектура параметров приложения будет всегда создавать только один экземпляр класса поставщика.
Important
Следует убедиться, что поставщик является потокобезопасным и позволяет выполнять запись в файлы конфигурации только одному потоку за раз.
Поставщик должен поддерживать все атрибуты, определенные в параметры System.Configuration пространства имен, хотя необходимо по меньшей мере поддерживать ApplicationScopedSettingAttribute и UserScopedSettingAttributeи также должен поддерживать DefaultSettingValueAttribute. Для тех атрибутов, которые он не поддерживает, поставщик должен завершаться ошибкой без уведомления. Он не должен создавать исключение. Если класс параметров использует Недопустимое сочетание атрибутов, тем не менее, такие как применение ApplicationScopedSettingAttribute и UserScopedSettingAttribute тот же параметр — ваш поставщик должен исключение и прервать операцию.