Delen via


Architectuur van toepassingsinstellingen

In dit onderwerp wordt beschreven hoe de architectuur voor toepassingsinstellingen werkt en worden geavanceerde functies van de architectuur verkend, zoals gegroepeerde instellingen en instellingensleutels.

De architectuur voor toepassingsinstellingen ondersteunt het definiëren van sterk getypte instellingen met toepassings- of gebruikersbereik en het behouden van de instellingen tussen toepassingssessies. De architectuur biedt een standaardpersistentie-engine voor het opslaan van instellingen en het laden ervan vanuit het lokale bestandssysteem. De architectuur definieert ook interfaces voor het leveren van een aangepaste persistentie-engine.

Interfaces worden geleverd waarmee aangepaste onderdelen hun eigen instellingen kunnen behouden wanneer ze worden gehost in een toepassing. Met behulp van instellingensleutels kunnen onderdelen instellingen voor meerdere exemplaren van het onderdeel afzonderlijk bewaren.

Instellingen definiëren

De architectuur voor toepassingsinstellingen wordt gebruikt in zowel ASP.NET als Windows Forms en bevat een aantal basisklassen die in beide omgevingen worden gedeeld. Het belangrijkste is SettingsBase, dat toegang biedt tot instellingen via een verzameling en methoden op laag niveau biedt voor het laden en opslaan van instellingen. Elke omgeving implementeert een eigen klasse die is afgeleid van SettingsBase om extra instellingenfunctionaliteit voor die omgeving te bieden. In een Windows Forms-toepassing moeten alle toepassingsinstellingen worden gedefinieerd op een klasse die is afgeleid van de ApplicationSettingsBase-klasse, waarmee de volgende functionaliteit wordt toegevoegd aan de basisklasse:

  • Laad- en besparingsbewerkingen op een hoger niveau

  • Ondersteuning voor gebruikersspecifieke instellingen

  • De instellingen van een gebruiker herstellen naar de vooraf gedefinieerde standaardwaarden

  • Instellingen upgraden van een vorige toepassingsversie

  • Instellingen valideren voordat ze worden gewijzigd of voordat ze worden opgeslagen

De instellingen kunnen worden beschreven met behulp van een aantal kenmerken die zijn gedefinieerd in de System.Configuration naamruimte; deze worden beschreven in kenmerken van toepassingsinstellingen. Wanneer u een instelling definieert, moet u deze toepassen met ApplicationScopedSettingAttribute of UserScopedSettingAttribute, waarin wordt beschreven of de instelling van toepassing is op de hele toepassing of alleen op de huidige gebruiker.

In het volgende codevoorbeeld wordt een aangepaste instellingenklasse gedefinieerd met één instelling, 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

Persistentie van instellingen

De ApplicationSettingsBase klasse handhaaft of laadt niet zelf instellingen; deze taak is voor de instellingenprovider, een klasse die is afgeleid van SettingsProvider. Als een afgeleide klasse van ApplicationSettingsBase geen instellingenprovider via de SettingsProviderAttributeopgeeft, wordt de standaardprovider, LocalFileSettingsProvider, gebruikt.

Het configuratiesysteem dat oorspronkelijk is uitgebracht met .NET Framework biedt ondersteuning voor het leveren van statische toepassingsconfiguratiegegevens via het machine.config-bestand van de lokale computer of in een app.exe.config-bestand dat u met uw toepassing implementeert. De LocalFileSettingsProvider klasse breidt deze systeemeigen ondersteuning op de volgende manieren uit:

  • Instellingen voor toepassingsbereik kunnen worden opgeslagen in de machine.config- of app.exe.config-bestanden. Machine.config is altijd alleen-lezen, terwijl app.exe.config voor de meeste toepassingen door beveiligingsoverwegingen tot alleen-lezen wordt beperkt.

  • Instellingen voor gebruikersbereik kunnen worden opgeslagen in app.exe.config bestanden. In dat geval worden ze beschouwd als statische standaardwaarden.

  • Niet-standaardinstellingen voor gebruikersbereik worden opgeslagen in een nieuw bestand, user.config. U kunt een standaardinstelling opgeven voor een instelling met gebruikersbereik met DefaultSettingValueAttribute. Omdat instellingen met gebruikersbereik vaak veranderen tijdens het uitvoeren van de toepassing, wordt user.config altijd gelezen/geschreven. Zie Waar worden instellingen voor gebruikersbereik opgeslagenvoor meer informatie.

Alle drie de configuratiebestanden slaan instellingen op in XML-indeling. Het XML-element op het hoogste niveau voor toepassingsbereikinstellingen wordt <appSettings>, terwijl <userSettings> wordt gebruikt voor instellingen met gebruikersbereik. Een app.exe.config-bestand dat zowel instellingen voor toepassingsbereik als standaardinstellingen voor gebruikersbereik bevat, ziet er als volgt uit:

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

Zie Schema voor toepassingsinstellingenvoor een definitie van de elementen in de sectie toepassingsinstellingen van een configuratiebestand.

Instellingenbindingen

Toepassingsinstellingen maken gebruik van de architectuur voor gegevensbindingen van Windows Forms om updates van instellingen in twee richtingen te bieden tussen het instellingenobject en de onderdelen. Als u Visual Studio gebruikt om toepassingsinstellingen te maken en deze toe te wijzen aan onderdeeleigenschappen, worden deze bindingen automatisch gegenereerd.

U kunt een toepassingsinstelling alleen binden aan een onderdeel dat ondersteuning biedt voor de IBindableComponent-interface. Het onderdeel moet ook een wijzigingsgebeurtenis implementeren voor een specifieke afhankelijke eigenschap of toepassingsinstellingen melden dat de eigenschap is gewijzigd via de INotifyPropertyChanged-interface. Als het onderdeel geen IBindableComponent implementeert en u verbinding maakt via Visual Studio, worden de afhankelijke eigenschappen de eerste keer ingesteld, maar worden deze niet bijgewerkt. Als het onderdeel IBindableComponent implementeert, maar geen meldingen voor eigenschapswijziging ondersteunt, wordt de binding niet bijgewerkt in het instellingenbestand wanneer de eigenschap wordt gewijzigd.

Sommige Onderdelen van Windows Forms, zoals ToolStripItem, bieden geen ondersteuning voor instellingenbindingen.

Serialisatie van instellingen

Wanneer LocalFileSettingsProvider instellingen op schijf moet opslaan, worden de volgende acties uitgevoerd:

  1. Gebruikt weerspiegeling om alle eigenschappen te onderzoeken die zijn gedefinieerd op uw ApplicationSettingsBase afgeleide klasse, om te zoeken naar eigenschappen die zijn toegepast met ApplicationScopedSettingAttribute of UserScopedSettingAttribute.

  2. Serialiseert de eigenschap naar schijf. Eerst wordt geprobeerd de ConvertToString of ConvertFromString aan te roepen op de gekoppelde TypeConvertervan het type. Als dit niet lukt, wordt in plaats daarvan XML-serialisatie gebruikt.

  3. Bepaalt welke instellingen worden gebruikt in welke bestanden, op basis van het kenmerk van de instelling.

Als u uw eigen instellingenklasse implementeert, kunt u de SettingsSerializeAsAttribute gebruiken om een instelling te markeren voor binaire of aangepaste serialisatie met behulp van de opsomming SettingsSerializeAs. Zie Toepassingsinstellingen makenvoor meer informatie over het maken van uw eigen instellingenklasse in code.

Bestandslocaties voor instellingen

De locatie van de app.exe.config- en gebruikersbestanden.config verschilt op basis van de installatie van de toepassing. Voor een Windows Forms-toepassing die naar de lokale computer is gekopieerd, bevindt app.exe.config zich in dezelfde map als de basismap van het hoofdbestand van het uitvoerbare bestand van de toepassing en bevindt gebruiker.config zich op de locatie die is opgegeven door de eigenschap Application.LocalUserAppDataPath. Voor een toepassing die door ClickOnce is geïnstalleerd, bevinden beide bestanden zich in de ClickOnce-gegevensmap onder %InstallRoot%\Documents and Settings\gebruikersnaam\Local Settings.

De opslaglocatie van deze bestanden verschilt enigszins als een gebruiker zwervende profielen heeft ingeschakeld, waardoor een gebruiker verschillende Windows- en toepassingsinstellingen kan definiëren wanneer ze andere computers binnen een domein gebruiken. In dat geval hebben zowel ClickOnce-toepassingen als niet-ClickOnce-toepassingen hun app.exe.config- en gebruikersbestanden.config die zijn opgeslagen onder %InstallRoot%\Documents and Settings\gebruikersnaam\Application Data.

Zie ClickOnce en Application Settingsvoor meer informatie over de werking van de functie Toepassingsinstellingen met de nieuwe implementatietechnologie. Zie Toegang tot lokale en externe gegevens in ClickOnce-toepassingenvoor meer informatie over de ClickOnce-gegevensmap.

Toepassingsinstellingen en -beveiliging

Toepassingsinstellingen zijn ontworpen voor gedeeltelijk vertrouwen, een beperkte omgeving die de standaardomgeving is voor Windows Forms-toepassingen die worden gehost via internet of een intranet. Er zijn geen speciale machtigingen nodig buiten gedeeltelijke vertrouwensrelatie voor het gebruik van toepassingsinstellingen met de standaardinstellingenprovider.

Wanneer toepassingsinstellingen worden gebruikt in een ClickOnce-toepassing, wordt het user.config-bestand opgeslagen in de map clickOnce-gegevens. De grootte van het user.config-bestand van de toepassing kan niet groter zijn dan het quotum voor de gegevensmap dat door ClickOnce is ingesteld. Zie ClickOnce and Application Settingsvoor meer informatie.

Aangepaste instellingenleveranciers

In de architectuur van toepassingsinstellingen is er een losse koppeling tussen de toepassingsinstellingen-wrapperklasse, afgeleid van ApplicationSettingsBase, en de bijbehorende instellingenprovider of -providers, afgeleid van SettingsProvider. Deze associatie wordt alleen gedefinieerd door de SettingsProviderAttribute die is toegepast op de wrapperklasse of de afzonderlijke eigenschappen. Als een instellingenprovider niet expliciet is opgegeven, wordt de standaardprovider, LocalFileSettingsProvider, gebruikt. Hierdoor biedt deze architectuur ondersteuning voor het maken en gebruiken van aangepaste instellingenproviders.

Stel dat u SqlSettingsProviderwilt ontwikkelen en gebruiken, een provider die alle instellingengegevens opslaat in een Microsoft SQL Server-database. Uw SettingsProvider-afgeleide klasse ontvangt deze informatie in de Initialize methode als parameter van het type System.Collections.Specialized.NameValueCollection. Vervolgens implementeert u de GetPropertyValues methode om uw instellingen op te halen uit het gegevensarchief en SetPropertyValues om ze op te slaan. Uw provider kan de SettingsPropertyCollection die is opgegeven aan GetPropertyValues gebruiken om de naam, het type en het bereik van de eigenschap te bepalen, evenals eventuele andere instellingenkenmerken die voor die eigenschap zijn gedefinieerd.

Uw provider moet één eigenschap en één methode implementeren waarvan de implementaties mogelijk niet duidelijk zijn. De eigenschap ApplicationName is een abstracte eigenschap van SettingsProvider; u moet het programma programmeren om het volgende te retourneren:

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

Uw afgeleide klasse moet ook een Initialize-methode implementeren die geen argumenten gebruikt en geen waarde retourneert. Deze methode wordt niet gedefinieerd door SettingsProvider.

Ten slotte implementeert u IApplicationSettingsProvider op uw provider om ondersteuning te bieden voor het vernieuwen van instellingen, het terugzetten van de standaardinstellingen en het upgraden van instellingen van de ene toepassingsversie naar de andere.

Nadat u uw provider hebt geïmplementeerd en gecompileerd, moet u uw instellingenklasse instrueren om deze provider te gebruiken in plaats van de standaardinstelling. U bereikt dit door middel van de SettingsProviderAttribute. Als deze wordt toegepast op een volledige instellingenklasse, wordt de provider gebruikt voor elke instelling die door de klasse wordt gedefinieerd; als deze wordt toegepast op afzonderlijke instellingen, gebruikt de architectuur van toepassingsinstellingen die provider alleen voor deze instellingen en gebruikt LocalFileSettingsProvider voor de rest. In het volgende codevoorbeeld ziet u hoe u de instellingenklasse instrueert voor het gebruik van uw aangepaste provider.

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

Een provider kan tegelijkertijd vanuit meerdere threads worden aangeroepen, maar schrijft altijd naar dezelfde opslaglocatie; Daarom zal de architectuur voor toepassingsinstellingen slechts één exemplaar van uw providerklasse instantiëren.

Belangrijk

U moet ervoor zorgen dat uw provider thread-veilig is en slechts één thread tegelijk toestaat om naar de configuratiebestanden te schrijven.

Uw provider hoeft niet alle instellingenkenmerken te ondersteunen die zijn gedefinieerd in de System.Configuration naamruimte, maar moet minimaal ondersteuning bieden ApplicationScopedSettingAttribute en UserScopedSettingAttribute, en moet ook ondersteuning bieden voor DefaultSettingValueAttribute. Voor de kenmerken die niet worden ondersteund, moet uw provider gewoon falen zonder melding te doen; er mag geen uitzondering optreden. Als de instellingenklasse een ongeldige combinatie van kenmerken gebruikt, zoals het toepassen van ApplicationScopedSettingAttribute en UserScopedSettingAttribute op dezelfde instelling, moet uw provider echter een uitzondering genereren en de bewerking beëindigen.

Zie ook