Знакомство с динамическими свойствами (Visual Studio)
Примечание
Интерфейс пользователя динамических свойств был удален из Visual Studio 2005.Однако динамические свойства по-прежнему поддерживаются.При импорте проекта из более ранних версий Visual Studio динамические свойства параметров будут сохранены в коде и будут работать во время выполнения.Для задания параметров приложения рекомендуется вместо этого использовать Конструктор проектов.Дополнительные сведения см. в разделах Страница "Параметры" в конструкторе проектов и Управление параметрами приложения.
Динамические свойства позволяют настраивать приложение таким образом, чтобы некоторые из значений свойств или все эти значения сохранялись во внешнем файле конфигурации, а не в скомпилированном коде приложения. Эта возможность позволяет администраторам обновлять значения свойств по необходимости, а также уменьшает общую стоимость поддержки приложения после его развертывания. Предположим, например, что при построении приложения в процессе разработки используется тестовая база данных, а после развертывания приложения необходимо перейти на производственную базу данных. Если значения свойств хранятся в приложении, то необходимо будет вручную изменять все параметры базы данных до выполнения развертывания, а затем повторно компилировать исходный код. Если же эти значения хранятся во внешнем файле, то необходимо будет внести лишь одно изменение в этот файл, чтобы при следующем запуске приложение использовало новые значения.
Примечание по безопасности |
---|
Безопасность значений свойств, хранящихся в файле конфигурации, не гарантируется.Конфиденциальные данные, например пароли и сведения о кредитных картах, не следует хранить в виде динамических свойств. |
Динамические свойства можно использовать в любом приложении, которое компилируется в файл EXE. В проектах, которые компилируются в библиотеку DLL, использование динамических свойств напрямую невозможно, но возможна динамическая настройка свойств библиотек DLL с помощью EXE-файла, ссылающегося на DLL-файл. Хотя динамическая обработка возможна для свойств любого компонента, формы или элемента управления, некоторые свойства могут лучше подходить для преобразования в динамические свойства, чем остальные. Чаще всего для сохранения и извлечения выбираются свойства, которые подключены к таким подверженным изменениям внешним ресурсам, как базы данных, журналы событий или счетчики производительности. Многие из этих свойств по умолчанию определены как свойства, которые могут быть настроены как динамические свойства.
Примечание
В примере кода в этом разделе используется объект SqlConnection и файл конфигурации; при их отсутствии код выдаст ошибку компиляции.
Динамические свойства и файлы конфигурации
Если указано, что свойство является настраиваемым, то его значение записывается в файл конфигурации, а в класс вставляется код, указывающий, что значение этого свойства должно извлекаться из данного внешнего ресурса. Имя файла конфигурации зависит от типа приложения: в веб-приложениях используется файл Web.config, а в приложениях Windows используется похожий файл с расширением CONFIG. Все формы и компоненты приложения используют единый файл конфигурации. В пределах одного приложения переключиться на другой файл конфигурации или использовать несколько файлов конфигурации невозможно.
В файле конфигурации свойства сохраняются в формате XML. Предположим, например, что свойство ConnectionString для подключения к данным должно быть сохранено в файле конфигурации. В редакторе кода будет отображен следующий код, указывающий, что значение сохраняется во внешнем файле:
Me.SqlConnection1.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString")
this.sqlConnection1.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString");
Примечание по безопасности |
---|
Дополнительные сведения о создании защищенных подключений к данным см. в разделе Защита сведений о соединении (ADO.NET). |
В файле конфигурации значение данного свойства сохраняется посредством XML с использованием ключа, указанного в коде формы:
<configuration>
<appSettings>
<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />
</appSettings>
</configuration>
Каждому значению в файле конфигурации назначается ключ, который используется для сохранения и извлечения этого значения. Начальная часть ключа указывает на компонент-источник значения. Например, эти два ключа указывают на свойство ConnectionString в двух различных подключениях к данным в пределах одного приложения:
<configuration>
<appSettings>
<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />
<add key="sqlConnection2.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />
</appSettings>
</configuration>
Чтобы динамически обновлять значения свойств в приложении, файл конфигурации можно изменять напрямую. Значения обновляются при следующем запуске приложения.
Отчасти, файлы конфигурации схожи с файлами ресурсов: и те, и другие используются для хранения значений вне скомпилированного приложения; и те, и другие используют для хранения информации формат XML. Однако цель использования файлов ресурсов значительно отличается от цели использования файлов конфигурации. Файлы ресурсов служат для сохранения строк и других локализуемых ресурсов для перевода, в то время как файлы конфигурации (в случае динамических свойств) используются для обновления значений свойств. Значения в файле ресурсов предназначены для перевода, а не изменения, в то время как значения динамических свойств в файле конфигурации могут быть изменены по мере необходимости. Кроме того, с одним проектом можно связать несколько файлов ресурсов, а для одного приложения возможно использование только одного файла конфигурации. Дополнительные сведения о файлах ресурсов см. в разделе Иерархическая организация ресурсов для локализации.
Задание нескольких свойств одному ключу
На одну связку ключа и значения в файле конфигурации могут ссылаться несколько свойств. Например, при наличии в классе трех компонентов, которые имеют доступ к одной базе данных, свойство ConnectionString для всех компонентов можно сохранить в одной связке ключа и значения. Это означает, что при изменении базы данных потребуется обновить лишь одно значение в файле параметров, чтобы применить изменение ко всем трем компонентам. Это можно сделать путем задания каждого из свойств одному и тому же ключу следующим образом:
Me.SqlConnection1.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString")
Me.SqlConnection2.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString")
Me.SqlConnection3.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString")
this.sqlConnection1.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString");
this.sqlConnection2.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString");
this.sqlConnection3.ConnectionString =
System.Configuration.ConfigurationManager.
AppSettings.Get("SqlConnection1.ConnectionString");
Обратите внимание, что несмотря на различие используемых компонентов, все они ссылаются на ключ для sqlConnection1.ConnectionString.
Если для нескольких свойств выбран один ключ, то в файл конфигурации вносится только одна запись. В качестве начального значения сохраняется значение первого свойства, которому был назначен данный ключ.
Типы данных и динамические свойства
XML сохраняет все типы данных в виде строк. Если сохраняемое значение свойства не является строкой, то в редакторе кода будут отображены дополнительные сведения, указывающие тип данных для этого значения. Предположим, например, что выполняется динамическое сохранение значений свойств Interval и Enabled компонента Timer. В файле конфигурации это свойство сохраняется следующим образом:
<appSettings>
<add key=timer1.Interval" value="100" />
<add key=timer1.Enabled" value="True" />
</appSettings>
В редакторе кода отобразится этот код, чтобы указать, что полученное значение должно быть изменено на Тип данных Double (Visual Basic):
Me.Timer1.Enabled = (New System.Configuration.
AppSettingsReader()).GetValue("timer1.Enabled", GetType(Boolean))
Me.Timer1.Interval = (New System.Configuration.
AppSettingsReader()).GetValue("Timer1.Interval", GetType(Double))
this.timer1.Enabled = (bool)(new System.Configuration.
AppSettingsReader().GetValue("timer1.Enabled", typeof(bool)));
this.timer1.Interval = (System.Double)(new System.Configuration.
AppSettingsReader().GetValue("timer1.Interval", typeof(System.Double)));
Примечание
Существует два типа таймеров: для форм Windows Forms и для серверных приложений, незначительные различия между которыми заключаются в моделях программирования.В данном примере используется серверный таймер.
Вопросы производительности и безопасности и динамические свойства
При использовании динамических свойств могут возникнуть две проблемы. Во-первых, сохранение и извлечение динамических свойств может повлиять на производительность приложения. Извлечение значений свойств из скомпилированного приложения выполняется несколько быстрее, чем извлечение значений свойств из файла конфигурации. При первом обращении приложения к значению в файле конфигурации производительность может несколько снижаться, так как приложению приходится считывать файл. Это снижение, однако, очень незначительное и не должно замечаться. При последующем извлечении этого или другого свойства влияние на производительность становится гораздо меньше и является аналогичным, наблюдаемому при чтении значений из хэш-таблицы.
Во-вторых, при хранении таких значений свойств, как имена и пароли пользователей во внешнем файле появляется необходимость контроля доступа пользователей к этому файлу и содержащихся в нем значений. Одним из способов обеспечения такого контроля является защита файла с помощью списка управления доступом (ACL) операционной системы Windows. В списке управления доступом содержится указание на операции, которые тот или иной пользователь может выполнять с определенными файлами и папками. Кроме того, при работе с веб-приложением можно использовать функцию встроенной безопасности, предоставляемую операционной системой Windows, службами IIS и сервером SQL Server. В этой модели реквизиты пользователя для проверки подлинности в локальной сети также используются для доступа к ресурсам базы данных, и в строке подключения имя пользователя или пароль в явном виде не содержатся.
Дополнительные сведения о безопасности см. в документации по операционной системе Windows или в следующих документах: