Sdílet prostřednictvím


Architektura nastavení aplikace

Toto téma popisuje, jak funguje architektura nastavení aplikace, a zkoumá pokročilé funkce architektury, jako jsou seskupené nastavení a klíče nastavení.

Architektura nastavení aplikace podporuje definování nastavení se silnou typovou kontrolou s aplikačním nebo uživatelským oborem a uchování nastavení mezi spuštěními aplikace. Architektura poskytuje výchozí modul trvalosti pro ukládání a načítání nastavení z místního systému souborů. Architektura také definuje rozhraní pro poskytování vlastního mechanizmu trvalosti.

Rozhraní jsou poskytována, která umožňují vlastním komponentám zachovat vlastní nastavení, když jsou hostované v aplikaci. Pomocí klíčů nastavení můžou komponenty uchovávat nastavení pro více instancí komponenty oddělené.

Definování nastavení

Architektura nastavení aplikace se používá v rámci ASP.NET i Modelu Windows Forms a obsahuje řadu základních tříd, které jsou sdíleny v obou prostředích. Nejdůležitější je SettingsBase, která poskytuje přístup k nastavení prostřednictvím kolekce a poskytuje metody nízké úrovně pro načítání a ukládání nastavení. Každé prostředí implementuje vlastní třídu odvozenou od SettingsBase, aby poskytovala další funkce nastavení pro dané prostředí. V aplikaci založené na modelu Windows Forms musí být všechna nastavení aplikace definována ve třídě odvozené z třídy ApplicationSettingsBase, která do základní třídy přidává následující funkce:

  • Operace pokročilého načítání a ukládání

  • Podpora uživatelsky specifických nastavení

  • Vrácení nastavení uživatele k předdefinovaným výchozím nastavením

  • Aktualizace nastavení z předchozí verze aplikace

  • Ověřování nastavení, a to buď před jejich změnou, nebo před jejich uložením

Nastavení lze popsat pomocí řady atributů definovaných v rámci oboru názvů System.Configuration; jsou popsány v atributy nastavení aplikace. Když definujete nastavení, musíte ho použít buď s ApplicationScopedSettingAttribute nebo UserScopedSettingAttribute, který popisuje, jestli se toto nastavení vztahuje na celou aplikaci, nebo jenom na aktuálního uživatele.

Následující příklad kódu definuje vlastní třídu nastavení s jedním nastavením, 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

Trvalost nastavení

Třída ApplicationSettingsBase sama o sobě neuchovává ani nenačítá nastavení; tato úloha spadá do zprostředkovatele nastavení, třída, která je odvozena z SettingsProvider. Pokud odvozená třída ApplicationSettingsBase nezadá zprostředkovatele nastavení prostřednictvím SettingsProviderAttribute, použije se výchozí zprostředkovatel LocalFileSettingsProvider.

Konfigurační systém, který byl původně vydán s rozhraním .NET Framework, podporuje poskytování konfiguračních dat statických aplikací prostřednictvím souboru machine.config místního počítače nebo v souboru app.exe.config, který nasadíte ve své aplikaci. Třída LocalFileSettingsProvider rozšiřuje tuto nativní podporu následujícími způsoby:

  • Nastavení s oborem aplikace se dají ukládat do machine.config nebo app.exe.config souborů. Machine.config je vždy jen pro čtení, zatímco app.exe.config je z bezpečnostních důvodů pro většinu aplikací omezeno jen na čtení.

  • Nastavení s oborem uživatele lze uložit do app.exe.config souborů, v takovém případě se považují za statické výchozí hodnoty.

  • Jiná než výchozí nastavení s oborem uživatele jsou uložena v novém souboru user.config. Pomocí DefaultSettingValueAttributemůžete zadat výchozí nastavení pro nastavení s oborem uživatele. Vzhledem k tomu, že se uživatelská nastavení často mění během provádění aplikace, user.config je vždy pro čtení i zápis. Další informace naleznete v části Kde jsou uložena nastavení s rozsahem na uživatele.

Všechny tři konfigurační soubory ukládají nastavení ve formátu XML. Element XML nejvyšší úrovně pro nastavení v oboru aplikace je <appSettings>, zatímco <userSettings> se používá pro nastavení v oboru uživatele. Soubor app.exe.config, který obsahuje nastavení s oborem aplikace i výchozí nastavení pro nastavení s oborem uživatele, by vypadal takto:

<?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>

Pro definici prvků v sekci nastavení aplikace konfiguračního souboru se podívejte na schéma nastavení aplikace.

Nastavení vazeb

Nastavení aplikace používá architekturu datových vazeb Modelu Windows Forms k zajištění obousměrné komunikace aktualizací nastavení mezi objektem a komponentami nastavení. Pokud pomocí sady Visual Studio vytvoříte nastavení aplikace a přiřadíte je vlastnostem komponenty, tyto vazby se vygenerují automaticky.

Nastavení aplikace můžete svázat pouze s komponentou, která podporuje IBindableComponent rozhraní. Komponenta také musí implementovat událost změny pro určitou vázanou vlastnost nebo upozornit nastavení aplikace, že se vlastnost změnila prostřednictvím rozhraní INotifyPropertyChanged. Pokud komponenta neimplementuje IBindableComponent a vytváříte vazbu prostřednictvím sady Visual Studio, vázané vlastnosti se nastaví poprvé, ale nebudou aktualizovány. Pokud komponenta implementuje IBindableComponent ale nepodporuje oznámení o změnách vlastností, vazba se při změně vlastnosti v souboru nastavení neaktualizuje.

Některé součásti Modelu Windows Forms, například ToolStripItem, nepodporují vazby nastavení.

Serializace nastavení

Když LocalFileSettingsProvider musí uložit nastavení na disk, provede následující akce:

  1. Používá reflexi k prozkoumání všech vlastností definovaných ve vaší ApplicationSettingsBase odvozené třídě a nalezení těch, které jsou aplikovány s ApplicationScopedSettingAttribute nebo UserScopedSettingAttribute.

  2. Serializuje vlastnost na disk. Nejprve se pokusí vyvolat ConvertToString nebo ConvertFromString u typu přidruženého TypeConverter. Pokud to neuspěje, použije místo toho serializaci XML.

  3. Určuje, která nastavení se budou na základě atributu nastavení nacházet v souborech.

Pokud implementujete vlastní třídu nastavení, můžete pomocí SettingsSerializeAsAttribute označit nastavení pro binární nebo vlastní serializaci pomocí SettingsSerializeAs výčtu. Další informace o vytváření vlastní třídy nastavení v kódu naleznete v tématu Postupy: Vytvoření nastavení aplikace.

Nastavení umístění souborů

Umístění souborů app.exe.config a uživatele.config se bude lišit v závislosti na způsobu instalace aplikace. V případě aplikace založené na modelu Windows Forms zkopírované do místního počítače bude app.exe.config umístěn ve stejném adresáři jako základní adresář hlavního spustitelného souboru aplikace a uživatel.config bude umístěn v umístění určeném vlastností Application.LocalUserAppDataPath. Pro aplikaci nainstalovanou pomocí Technologie ClickOnce budou oba tyto soubory umístěny v adresáři ClickOnce Data Pod %InstallRoot%\Documents and Settings\uživatelské jméno\Local Settings.

Umístění těchto souborů se mírně liší, pokud uživatel povolil cestovní profily, což uživateli umožňuje definovat různá nastavení systému Windows a aplikace, když používá jiné počítače v rámci domény. V takovém případě budou aplikace ClickOnce i aplikace jiné než ClickOnce mít své app.exe.config a uživatele.config soubory uložené v části %InstallRoot%\Documents and Settings\uživatelské jméno\Application Data.

Další informace o tom, jak funkce Nastavení aplikace funguje s novou technologií nasazení, naleznete v tématu ClickOnce a Nastavení aplikace. Další informace o ClickOnce Data Directory naleznete v tématu Přístup k místním a vzdáleným datům v aplikacích ClickOnce.

Nastavení a zabezpečení aplikací

Nastavení aplikace jsou navržená tak, aby fungovala v částečné důvěryhodnosti, omezené prostředí, které je výchozím nastavením pro aplikace Windows Forms hostované přes internet nebo intranet. K použití nastavení aplikace s výchozím poskytovatelem nastavení nejsou nutná žádná zvláštní oprávnění nad rámec částečné důvěryhodnosti.

Pokud se nastavení aplikace používá v aplikaci ClickOnce, soubor user.config je uložen v adresáři dat ClickOnce. Velikost souboru user.config aplikace nemůže překročit kvótu adresáře dat nastavenou technologií ClickOnce. Další informace naleznete v tématu ClickOnce a Nastavení aplikace.

Vlastní zprostředkovatelé nastavení

V architektuře Nastavení aplikace existuje volná vazba mezi třídou obálky nastavení aplikací odvozenou z ApplicationSettingsBasea přidruženým zprostředkovatelem nastavení nebo zprostředkovateli odvozenými z SettingsProvider. Toto přidružení je definováno pouze SettingsProviderAttribute použitým na obálkovou třídu nebo její jednotlivé vlastnosti. Pokud není explicitně zadán poskytovatel nastavení, použije se výchozí zprostředkovatel LocalFileSettingsProvider. V důsledku toho tato architektura podporuje vytváření a používání zprostředkovatelů vlastních nastavení.

Předpokládejme například, že chcete vyvíjet a používat SqlSettingsProvider, poskytovatel, který bude ukládat všechna data nastavení do databáze Microsoft SQL Server. Vaše třída odvozená z SettingsProviderby obdržela tyto informace v metodě Initialize jako parametr typu System.Collections.Specialized.NameValueCollection. Pak byste implementovali metodu GetPropertyValues, která načte nastavení z úložiště dat, a SetPropertyValues je uložit. Váš poskytovatel může použít SettingsPropertyCollection zadané k GetPropertyValues k určení názvu, typu a oboru vlastnosti a také všech dalších atributů nastavení definovaných pro tuto vlastnost.

Váš poskytovatel bude muset implementovat jednu vlastnost a jednu metodu, jejíž implementace nemusí být zřejmé. Vlastnost ApplicationName je abstraktní vlastností SettingsProvider; měli byste ho naprogramovat, aby vrátil následující:

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

Odvozená třída musí také implementovat Initialize metodu, která nepřijímá žádné argumenty a nevrací žádnou hodnotu. Tato metoda není definována SettingsProvider.

Nakonec implementujete IApplicationSettingsProvider u svého poskytovatele, abyste zajistili podporu pro aktualizace nastavení, vrátili nastavení na výchozí hodnoty a upgradovali nastavení z jedné verze aplikace na jinou.

Jakmile implementujete a zkompilujete svého poskytovatele, musíte dát třídě nastavení pokyn, aby používala tohoto zprostředkovatele místo výchozího nastavení. Toho dosáhnete prostřednictvím SettingsProviderAttribute. Pokud se použije na celou třídu nastavení, poskytovatel se použije pro každé nastavení, které třída definuje; pokud se použije na jednotlivá nastavení, architektura nastavení aplikace používá tohoto zprostředkovatele pouze pro tato nastavení a používá LocalFileSettingsProvider pro zbytek. Následující příklad kódu ukazuje, jak dát třídě nastavení pokyn, aby používal vlastního zprostředkovatele.

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

Zprostředkovatel může být volán z více vláken současně, ale vždy zapíše do stejného umístění úložiště; proto architektura Nastavení aplikace vytvoří pouze jednu instanci vaší třídy zprostředkovatele.

Důležitý

Měli byste zajistit, aby váš poskytovatel byl bezpečný pro přístup z více vláken a aby do konfiguračních souborů zapisuje vždy jen jedno vlákno.

Váš poskytovatel nemusí podporovat všechny atributy nastavení definované v oboru názvů System.Configuration, i když musí minimálně podporovat ApplicationScopedSettingAttribute a UserScopedSettingAttributea měl by také podporovat DefaultSettingValueAttribute. U atributů, které nepodporuje, by váš poskytovatel měl pouze selhat bez oznámení; neměl by vyvolat výjimku. Pokud třída nastavení používá neplatnou kombinaci atributů, ale – například použití ApplicationScopedSettingAttribute a UserScopedSettingAttribute na stejné nastavení – by váš poskytovatel měl vyvolat výjimku a ukončit operaci.

Viz také