Architektura ustawień aplikacji

W tym temacie opisano sposób działania architektury Ustawienia aplikacji oraz eksplorowanie zaawansowanych funkcji architektury, takich jak pogrupowane ustawienia i klucze ustawień.

Architektura ustawień aplikacji obsługuje definiowanie silnie typiowanych ustawień z zakresem aplikacji lub użytkownika oraz utrwalanie ustawień między sesjami aplikacji. Architektura zapewnia domyślny aparat trwałości do zapisywania ustawień i ładowania ich z lokalnego systemu plików. Architektura definiuje również interfejsy służące do dostarczania niestandardowego aparatu trwałości.

Interfejsy są udostępniane, aby umożliwić składnikom niestandardowym utrwalanie własnych ustawień, gdy są hostowane w aplikacji. Za pomocą kluczy ustawień składniki mogą przechowywać ustawienia dla wielu wystąpień składnika oddzielnie.

Definiowanie Ustawienia

Architektura ustawień aplikacji jest używana zarówno w ASP.NET, jak i w formularzach Systemu Windows, i zawiera wiele klas bazowych, które są współużytkowane w obu środowiskach. Najważniejsze jest to SettingsBase, co zapewnia dostęp do ustawień za pośrednictwem kolekcji i zapewnia metody niskiego poziomu ładowania i zapisywania ustawień. Każde środowisko implementuje własną klasę pochodną SettingsBase , aby zapewnić dodatkowe funkcje ustawień dla tego środowiska. W aplikacji opartej na formularzach systemu Windows wszystkie ustawienia aplikacji muszą być zdefiniowane w klasie pochodzącej z ApplicationSettingsBase klasy, która dodaje następujące funkcje do klasy bazowej:

  • Operacje ładowania i zapisywania wyższego poziomu

  • Obsługa ustawień o zakresie użytkownika

  • Przywracanie ustawień użytkownika do wstępnie zdefiniowanych wartości domyślnych

  • Uaktualnianie ustawień z poprzedniej wersji aplikacji

  • Sprawdzanie poprawności ustawień przed ich zmianą lub zapisaną

Ustawienia można opisać przy użyciu wielu atrybutów zdefiniowanych w System.Configuration przestrzeni nazw. Są one opisane w temacie Application Ustawienia Attributes (Atrybuty aplikacji Ustawienia). Podczas definiowania ustawienia należy zastosować je za ApplicationScopedSettingAttribute pomocą elementu lub UserScopedSettingAttribute, który opisuje, czy ustawienie dotyczy całej aplikacji, czy tylko bieżącego użytkownika.

Poniższy przykład kodu definiuje klasę ustawień niestandardowych z pojedynczym ustawieniem. 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

trwałość Ustawienia

Klasa ApplicationSettingsBase nie utrzymuje się ani nie ładuje ustawień; to zadanie należy do dostawcy ustawień, klasy pochodzącej z klasy SettingsProvider. Jeśli klasa pochodna ApplicationSettingsBase klasy nie określa dostawcy ustawień za pośrednictwem SettingsProviderAttribute, zostanie użyty domyślny dostawca , LocalFileSettingsProvider.

System konfiguracji, który został pierwotnie wydany za pomocą programu .NET Framework, obsługuje dostarczanie danych konfiguracji statycznej aplikacji za pośrednictwem pliku machine.config komputera lokalnego app.lub w pliku exe.config wdrażanym za pomocą aplikacji. Klasa LocalFileSettingsProvider rozszerza tę natywną obsługę w następujący sposób:

  • Ustawienia o zakresie aplikacji można przechowywać w plikach machine.config lub app.exe.config. Plik Machine.config jest zawsze tylko do odczytu, a appplik .exe.config jest ograniczony przez zagadnienia dotyczące zabezpieczeń do odczytu tylko do odczytu dla większości aplikacji.

  • Ustawienia o zakresie użytkownika można przechowywać w appplikach .exe.config, w tym przypadku są traktowane jako statyczne wartości domyślne.

  • Inne niż domyślne ustawienia o zakresie użytkownika są przechowywane w nowym pliku user.config. Ustawienie domyślne dla ustawienia o zakresie użytkownika można określić za pomocą polecenia DefaultSettingValueAttribute. Ponieważ ustawienia o zakresie użytkownika często zmieniają się podczas wykonywania aplikacji, plik user.config jest zawsze odczytywany/zapisywany. Aby uzyskać więcej informacji, zobacz Gdzie są przechowywane ustawienia o zakresie użytkownika.

Wszystkie trzy pliki konfiguracji przechowują ustawienia w formacie XML. Element xml najwyższego poziomu dla ustawień o zakresie aplikacji to <appSettings>, a element <userSettings> jest używany dla ustawień o zakresie użytkownika. Plik app.exe.config, który zawiera zarówno ustawienia o zakresie aplikacji, jak i wartości domyślne dla ustawień o zakresie użytkownika, wygląda następująco:

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

Aby uzyskać definicję elementów w sekcji ustawień aplikacji pliku konfiguracji, zobacz Application Ustawienia Schema (Schemat Ustawienia aplikacji).

powiązania Ustawienia

Ustawienia aplikacji używają architektury powiązania danych formularzy systemu Windows, aby zapewnić dwukierunkową komunikację aktualizacji ustawień między obiektem i składnikami ustawień. Jeśli używasz programu Visual Studio do tworzenia ustawień aplikacji i przypisywania ich do właściwości składnika, te powiązania są generowane automatycznie.

Ustawienie aplikacji można powiązać tylko ze składnikiem obsługującym IBindableComponent interfejs. Ponadto składnik musi zaimplementować zdarzenie zmiany dla określonej powiązanej właściwości lub powiadomić ustawienia aplikacji o zmianie właściwości za pośrednictwem interfejsu INotifyPropertyChanged . Jeśli składnik nie zostanie zaimplementowany IBindableComponent i zostanie powiązany za pomocą programu Visual Studio, właściwości powiązane zostaną ustawione po raz pierwszy, ale nie zostaną zaktualizowane. Jeśli składnik implementuje IBindableComponent , ale nie obsługuje powiadomień o zmianie właściwości, powiązanie nie zostanie zaktualizowane w pliku ustawień po zmianie właściwości.

Niektóre składniki formularzy systemu Windows, takie jak ToolStripItem, nie obsługują powiązań ustawień.

serializacja Ustawienia

Gdy LocalFileSettingsProvider należy zapisać ustawienia na dysku, wykonuje następujące akcje:

  1. Używa odbicia do zbadania wszystkich właściwości zdefiniowanych w ApplicationSettingsBase klasie pochodnej, znajdowania tych, które są stosowane z elementem ApplicationScopedSettingAttribute lub UserScopedSettingAttribute.

  2. Serializuje właściwość na dysku. Najpierw próbuje wywołać element ConvertToString lub ConvertFromString skojarzonego typu TypeConverter. Jeśli to się nie powiedzie, zamiast tego używa serializacji XML.

  3. Określa ustawienia, w których plikach, na podstawie atrybutu ustawienia.

Jeśli zaimplementujesz własną klasę ustawień, możesz użyć SettingsSerializeAsAttribute elementu , aby oznaczyć ustawienie dla serializacji binarnej lub niestandardowej SettingsSerializeAs przy użyciu wyliczenia. Aby uzyskać więcej informacji na temat tworzenia własnej klasy ustawień w kodzie, zobacz How to: Create Application Ustawienia (Instrukcje: tworzenie aplikacji Ustawienia).

lokalizacje plików Ustawienia

Lokalizacja appplików .exe.config i user.config będzie się różnić w zależności od sposobu instalowania aplikacji. W przypadku aplikacji opartej na formularzach systemu Windows skopiowanych na komputer applokalny plik .exe.config będzie znajdować się w tym samym katalogu co katalog podstawowy głównego pliku wykonywalnego aplikacji, a plik user.config będzie znajdować się w lokalizacji określonej przez Application.LocalUserAppDataPath właściwość. W przypadku aplikacji zainstalowanej za pomocą technologii ClickOnce oba te pliki będą znajdować się w katalogu danych ClickOnce poniżej katalogu %InstallRoot%\Documents i Ustawienia\username\Local Ustawienia.

Lokalizacja przechowywania tych plików jest nieco inna, jeśli użytkownik włączył profile mobilne, co umożliwia użytkownikowi definiowanie różnych ustawień systemu Windows i aplikacji podczas korzystania z innych komputerów w domenie. W takim przypadku zarówno aplikacje ClickOnce, jak i aplikacje inne niż ClickOnce będą miały pliki app.exe.config i user.config przechowywane w folderze %InstallRoot%\Documents i Ustawienia\username\Application Data.

Aby uzyskać więcej informacji na temat sposobu działania funkcji application Ustawienia z nową technologią wdrażania, zobacz ClickOnce i Application Ustawienia. Aby uzyskać więcej informacji na temat katalogu danych ClickOnce, zobacz Uzyskiwanie dostępu do danych lokalnych i zdalnych w aplikacjach ClickOnce.

Ustawienia aplikacji i zabezpieczenia

Ustawienia aplikacji są przeznaczone do pracy w częściowym zaufaniu, ograniczonym środowisku, które jest ustawieniem domyślnym dla aplikacji Windows Forms hostowanych przez Internet lub intranet. Do korzystania z ustawień aplikacji z dostawcą ustawień domyślnych nie są wymagane żadne specjalne uprawnienia wykraczające poza częściowe zaufanie.

Gdy ustawienia aplikacji są używane w aplikacji ClickOnce, userplik config jest przechowywany w katalogu danych ClickOnce. Rozmiar pliku config aplikacji usernie może przekroczyć limitu przydziału katalogu danych ustawionego przez aplikację ClickOnce. Aby uzyskać więcej informacji, zobacz ClickOnce i Application Ustawienia.

Niestandardowi dostawcy Ustawienia

W architekturze application Ustawienia istnieje luźne sprzężenie między klasą otoki ustawień aplikacji, pochodzącą z ApplicationSettingsBaseklasy , a skojarzonym dostawcą ustawień lub dostawcą, pochodzącym z SettingsProviderklasy . To skojarzenie jest definiowane SettingsProviderAttribute tylko przez zastosowany do klasy otoki lub jej poszczególnych właściwości. Jeśli dostawca ustawień nie zostanie jawnie określony, zostanie użyty domyślny dostawca , LocalFileSettingsProvider. W związku z tym ta architektura obsługuje tworzenie i używanie dostawców ustawień niestandardowych.

Załóżmy na przykład, że chcesz opracowywać i używać SqlSettingsProviderprogramu , dostawcy, który będzie przechowywać wszystkie dane ustawień w bazie danych programu Microsoft SQL Server. Klasa SettingsProvider-pochodna otrzyma te informacje w metodzie Initialize jako parametr typu System.Collections.Specialized.NameValueCollection. Następnie należy zaimplementować metodę GetPropertyValues w celu pobrania ustawień z magazynu danych i SetPropertyValues zapisania ich. Dostawca może użyć podanego SettingsPropertyCollection elementu w celu GetPropertyValues określenia nazwy, typu i zakresu właściwości, a także innych atrybutów ustawień zdefiniowanych dla tej właściwości.

Dostawca będzie musiał zaimplementować jedną właściwość i jedną metodę, której implementacje mogą nie być oczywiste. Właściwość ApplicationName jest abstrakcyjną właściwością SettingsProvider; należy ją zaprogramować, aby zwrócić następujące elementy:

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

Klasa pochodna musi również zaimplementować metodę Initialize , która nie przyjmuje żadnych argumentów i nie zwraca żadnej wartości. Ta metoda nie jest zdefiniowana przez SettingsProvidermetodę .

Na koniec zaimplementujesz IApplicationSettingsProvider dostawcę, aby zapewnić obsługę odświeżania ustawień, przywracania ustawień domyślnych i uaktualniania ustawień z jednej wersji aplikacji do innej.

Po zaimplementowaniu i skompilowaniu dostawcy należy poinstruować klasę ustawień, aby używała tego dostawcy zamiast domyślnego. Można to osiągnąć za pomocą .SettingsProviderAttribute W przypadku zastosowania do całej klasy ustawień dostawca jest używany dla każdego ustawienia zdefiniowanego przez klasę; w przypadku zastosowania do poszczególnych ustawień architektura aplikacji Ustawienia używa tego dostawcy tylko dla tych ustawień i używa LocalFileSettingsProvider ich w pozostałej części. Poniższy przykład kodu pokazuje, jak poinstruować klasę ustawień, aby korzystała z dostawcy niestandardowego.

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

Dostawca może być wywoływany z wielu wątków jednocześnie, ale zawsze będzie zapisywać w tej samej lokalizacji magazynu; W związku z tym architektura application Ustawienia będzie zawsze tworzyła wystąpienie pojedynczego wystąpienia klasy dostawcy.

Ważne

Upewnij się, że dostawca jest bezpieczny wątkowo i zezwala tylko jednemu wątkowi na zapisywanie w plikach konfiguracji.

Dostawca nie musi obsługiwać wszystkich atrybutów ustawień zdefiniowanych w System.Configuration przestrzeni nazw, ale musi obsługiwać co najmniej obsługę ApplicationScopedSettingAttribute parametrów i UserScopedSettingAttribute, a także .DefaultSettingValueAttribute W przypadku tych atrybutów, które nie są obsługiwane, dostawca powinien po prostu zakończyć się niepowodzeniem bez powiadomienia; nie powinien zgłaszać wyjątku. Jeśli jednak klasa ustawień używa nieprawidłowej kombinacji atrybutów — na przykład stosowania ApplicationScopedSettingAttribute i UserScopedSettingAttribute do tego samego ustawienia — dostawca powinien zgłosić wyjątek i zakończyć działanie.

Zobacz też