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í silného typu s oborem aplikace nebo uživatele a zachování nastavení mezi relacemi 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 modulu 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 model 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 z SettingsBase toho, aby poskytovala další funkce nastavení pro dané prostředí. V aplikaci založené na model Windows Forms musí být všechna nastavení aplikace definována na třídě odvozené z ApplicationSettingsBase třídy, která přidává do základní třídy následující funkce:

  • Operace načítání a ukládání na vyšší úrovni

  • Podpora nastavení s vymezeným uživatelem

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

  • Upgrade 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 System.Configuration oboru názvů. Jsou popsány v atributech Nastavení aplikace. Když definujete nastavení, musíte ho použít buď ApplicationScopedSettingAttribute nebo UserScopedSettingAttribute, který popisuje, jestli se nastavení vztahuje na celou aplikaci, nebo pouze 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á nebo nenačítá nastavení; tato úloha spadá do zprostředkovatele nastavení, třídy, která je odvozena z SettingsProvider. Pokud odvozená třída ApplicationSettingsBase neurčí zprostředkovatele nastavení prostřednictvím SettingsProviderAttribute, pak se použije 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 app.souboru 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 lze uložit buď v souborech machine.config, nebo app.exe.config. Machine.config je vždy jen pro čtení, zatímco app.exe.config je omezen bezpečnostními aspekty jen pro čtení pro většinu aplikací.

  • Uživatelsky vymezená nastavení mohou být uložena v appsouborech .exe.config, v takovém případě jsou považovány za statické výchozí hodnoty.

  • Jiná než výchozí nastavení s oborem uživatele se ukládají do nového souboru user.config. Pro nastavení s oborem uživatele můžete zadat výchozí hodnotu pomocí DefaultSettingValueAttributeparametru . Vzhledem k tomu, že se nastavení v oboru uživatele často mění během provádění aplikace, user.config je vždy pro čtení a zápis. Další informace naleznete v tématu Kde jsou uložena nastavení v oboru uživatele.

Všechny tři konfigurační soubory ukládají nastavení ve formátu XML. Element XML nejvyšší úrovně pro nastavení s oborem 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í hodnoty 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>

Definici prvků v části nastavení aplikace konfiguračního souboru naleznete v tématu Application Nastavení Schema.

vazby Nastavení

Nastavení aplikace používá architekturu model Windows Forms datových vazeb 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á rozhraní podporuje IBindableComponent . 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 INotifyPropertyChanged rozhraní. 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 oznámení o změnách vlastností, ale nepodporuje oznámení o změnách vlastností, vazba se při změně vlastnosti v souboru nastavení neaktualizuje.

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

serializace Nastavení

Když LocalFileSettingsProvider je nutné 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ě, nalezení těch, které jsou použity buď ApplicationScopedSettingAttribute nebo UserScopedSettingAttribute.

  2. Serializuje vlastnost na disk. Nejprve se pokusí volat ConvertToString nebo ConvertFromString na přidruženém TypeConvertertypu . 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í výčtu SettingsSerializeAsAttributeSettingsSerializeAs označit nastavení pro binární nebo vlastní serializaci. Další informace o vytvoření vlastní třídy nastavení v kódu naleznete v tématu Postupy: Vytvoření aplikace Nastavení.

umístění souborů Nastavení

Umístění appsouborů .exe.config a user.config se bude lišit v závislosti na tom, jak je aplikace nainstalována. V případě model Windows Forms aplikace zkopírované do místního počítače appse soubor .exe.config nachází ve stejném adresáři jako základní adresář hlavního spustitelného souboru aplikace a soubor user.config se nachází v umístění určeném Application.LocalUserAppDataPath vlastností. Pro aplikaci nainstalovanou pomocí Technologie ClickOnce se oba tyto soubory nacházejí v adresáři dat ClickOnce pod položkou %InstallRoot%\Documents a Nastavení\username\Local Nastavení.

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 mít aplikace ClickOnce i aplikace jiné než ClickOnce své appsoubory .exe.config a user.config uložené ve složce %InstallRoot%\Documents a Nastavení\username\Application Data.

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

Nastavení a zabezpečení aplikací

Nastavení aplikace je navržené tak, aby fungovalo v částečném vztahu důvěryhodnosti, omezeném prostředí, které je výchozím nastavením pro model Windows Forms aplikace 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, usersoubor .config je uložen v adresáři dat ClickOnce. Velikost souboru .config aplikace usernemůže překročit kvótu adresáře dat nastavenou technologií ClickOnce. Další informace naleznete v tématu ClickOnce a aplikace Nastavení.

Vlastní poskytovatelé Nastavení

V architektuře Nastavení aplikace existuje volné spojení mezi třídou obálky nastavení aplikací odvozenou od ApplicationSettingsBasea přidruženým zprostředkovatelem nebo zprostředkovateli nastavení odvozenými z SettingsProvider. Toto přidružení je definováno pouze použitým SettingsProviderAttribute u třídy obálky nebo jeho individuálních vlastností. Pokud není explicitně zadán poskytovatel nastavení, LocalFileSettingsProviderpoužije se výchozí zprostředkovatel. 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, zprostředkovatel, který bude ukládat všechna data nastavení do databáze Microsoft SQL Serveru. Vaše SettingsProvider-odvozená třída obdrží tyto informace v jeho Initialize metodě jako parametr typu System.Collections.Specialized.NameValueCollection. Pak byste implementovali metodu GetPropertyValues pro načtení nastavení z úložiště dat a SetPropertyValues jejich uložení. Poskytovatel může pomocí zadaného SettingsPropertyCollectionGetPropertyValues atributu určit název, typ a obor vlastnosti a také všechny další atributy nastavení definované 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 ji naprogramovat tak, aby vrátila 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 metodu Initialize , která nepřijímá žádné argumenty a nevrací žádnou hodnotu. Tato metoda není definována .SettingsProvider

Nakonec implementujete IApplicationSettingsProvider u svého poskytovatele podporu pro aktualizace nastavení, vrátíte nastavení na výchozí hodnoty a upgradujete 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 aplikace Nastavení používá tohoto zprostředkovatele pouze pro tato nastavení a používá LocalFileSettingsProvider ho 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ří instanci pouze jedné instance 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 System.Configuration oboru názvů, i když musí mít minimální podporu 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ů , například použití ApplicationScopedSettingAttribute a UserScopedSettingAttribute stejné nastavení , by váš poskytovatel měl vyvolat výjimku a ukončit operaci.

Viz také