Konfigurationsverwaltung

Hinweis

Dieses eBook wurde im Frühjahr 2017 veröffentlicht und wurde seitdem nicht aktualisiert. Es gibt viel in dem Buch, das wertvoll bleibt, aber einige der Materialien sind veraltet.

Einstellungen ermöglichen die Trennung von Daten, die das Verhalten einer App mit Code konfigurieren, sodass das Verhalten geändert werden kann, ohne die App neu zu erstellen. Es gibt zwei Arten von Einstellungen: App-Einstellungen und Benutzereinstellungen.

App-Einstellungen sind Daten, die von einer App erstellt und verwaltet werden. Sie können Daten wie feste Webdienstendpunkte, API-Schlüssel und den Laufzeitzustand enthalten. App-Einstellungen sind an das Vorhandensein der App gebunden und sind nur für diese App aussagekräftig.

Benutzereinstellungen sind die anpassbaren Einstellungen einer App, die sich auf das Verhalten der App auswirken und keine häufige Erneute Anpassung erfordern. Beispielsweise kann eine App dem Benutzer erlauben, anzugeben, wo Daten abgerufen werden sollen, und wie sie auf dem Bildschirm angezeigt werden.

Xamarin.Forms enthält ein persistentes Wörterbuch, das zum Speichern von Einstellungsdaten verwendet werden kann. Auf dieses Wörterbuch kann mithilfe der Application.Current.Properties Eigenschaft zugegriffen werden, und alle Darin platzierten Daten werden gespeichert, wenn die App in einen Ruhezustand wechselt und wiederhergestellt wird, wenn die App fortgesetzt oder erneut gestartet wird. Darüber hinaus verfügt die Klasse auch über eine SavePropertiesAsync Methode, mit der Application eine App bei Bedarf ihre Einstellungen speichern kann. Weitere Informationen zu diesem Wörterbuch finden Sie unter Properties Dictionary.

Ein Nachteil beim Speichern von Daten mithilfe des Xamarin.Forms persistenten Wörterbuchs besteht darin, dass es sich nicht einfach um datengebundene Daten handelt. Daher verwendet die mobile eShopOnContainers-App die Xam.Plugins.Settings-Bibliothek, die von NuGet verfügbar ist. Diese Bibliothek bietet einen konsistenten, typsicheren, plattformübergreifenden Ansatz zum Beibehalten und Abrufen von App- und Benutzereinstellungen, während die systemeigene Einstellungsverwaltung verwendet wird, die von jeder Plattform bereitgestellt wird. Darüber hinaus ist es einfach, Datenbindung zu verwenden, um auf Einstellungsdaten zuzugreifen, die von der Bibliothek verfügbar gemacht werden.

Hinweis

Während die Xam.Plugin.Settings-Bibliothek sowohl App- als auch Benutzereinstellungen speichern kann, unterscheidet sie nicht zwischen den beiden.

Erstellen einer Einstellungsklasse

Bei Verwendung der Xam.Plugins.Settings-Bibliothek sollte eine einzelne statische Klasse erstellt werden, die die für die App erforderlichen App- und Benutzereinstellungen enthält. Das folgende Codebeispiel zeigt die Einstellungsklasse in der mobilen eShopOnContainers-App:

public static class Settings  
{  
    private static ISettings AppSettings  
    {  
        get  
        {  
            return CrossSettings.Current;  
        }  
    }  
    ...  
}

Einstellungen können über die ISettings API gelesen und geschrieben werden, die von der Xam.Plugins.Settings-Bibliothek bereitgestellt wird. Diese Bibliothek bietet ein Singleton, das für den Zugriff auf die API verwendet werden kann, CrossSettings.Currentund die Einstellungsklasse einer App sollte diesen Singleton über eine ISettings Eigenschaft verfügbar machen.

Hinweis

Die Verwendung von Direktiven für die Namespaces "Plugin.Settings" und "Plugin.Settings.Abstractions" sollte einer Klasse hinzugefügt werden, die Zugriff auf die Bibliothekstypen "Xam.Plugins.Settings" erfordert.

Hinzufügen einer Einstellung

Jede Einstellung besteht aus einem Schlüssel, einem Standardwert und einer Eigenschaft. Das folgende Codebeispiel zeigt alle drei Elemente für eine Benutzereinstellung, die die Basis-URL für die Onlinedienste darstellt, mit der die mobile eShopOnContainers-App eine Verbindung herstellt:

public static class Settings  
{  
    ...  
    private const string IdUrlBase = "url_base";  
    private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint;  
    ...  

    public static string UrlBase  
    {  
        get  
        {  
            return AppSettings.GetValueOrDefault<string>(IdUrlBase, UrlBaseDefault);  
        }  
        set  
        {  
            AppSettings.AddOrUpdateValue<string>(IdUrlBase, value);  
        }  
    }  
}

Der Schlüssel ist immer eine Konstzeichenfolge, die den Schlüsselnamen definiert, wobei der Standardwert für die Einstellung ein statischer Schreibwert des erforderlichen Typs ist. Durch die Angabe eines Standardwerts wird sichergestellt, dass ein gültiger Wert verfügbar ist, wenn eine nicht festgelegte Einstellung abgerufen wird.

Die UrlBase statische Eigenschaft verwendet zwei Methoden aus der ISettings API, um den Einstellungswert zu lesen oder zu schreiben. Die ISettings.GetValueOrDefault Methode wird verwendet, um den Wert einer Einstellung aus plattformspezifischem Speicher abzurufen. Wenn für die Einstellung kein Wert definiert ist, wird stattdessen der Standardwert abgerufen. Ebenso wird die Methode verwendet, um den ISettings.AddOrUpdateValue Wert einer Einstellung auf plattformspezifischen Speicher beizubehalten.

Anstatt einen Standardwert innerhalb der Settings Klasse zu definieren, ruft die UrlBaseDefault Zeichenfolge ihren Wert aus der GlobalSetting Klasse ab. Das folgende Codebeispiel zeigt die BaseEndpoint Eigenschaft und UpdateEndpoint Methode in dieser Klasse:

public class GlobalSetting  
{  
    ...  
    public string BaseEndpoint  
    {  
        get { return _baseEndpoint; }  
        set  
        {  
            _baseEndpoint = value;  
            UpdateEndpoint(_baseEndpoint);  
        }  
    }  
    ...  

    private void UpdateEndpoint(string baseEndpoint)  
    {  
        RegisterWebsite = string.Format("{0}:5105/Account/Register", baseEndpoint);  
        CatalogEndpoint = string.Format("{0}:5101", baseEndpoint);  
        OrdersEndpoint = string.Format("{0}:5102", baseEndpoint);  
        BasketEndpoint = string.Format("{0}:5103", baseEndpoint);  
        IdentityEndpoint = string.Format("{0}:5105/connect/authorize", baseEndpoint);  
        UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);  
        TokenEndpoint = string.Format("{0}:5105/connect/token", baseEndpoint);  
        LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);  
        IdentityCallback = string.Format("{0}:5105/xamarincallback", baseEndpoint);  
        LogoutCallback = string.Format("{0}:5105/Account/Redirecting", baseEndpoint);  
    }  
}

Jedes Mal, wenn die BaseEndpoint Eigenschaft festgelegt wird, wird die UpdateEndpoint Methode aufgerufen. Diese Methode aktualisiert eine Reihe von Eigenschaften, die alle auf der Benutzereinstellung basieren, die von der UrlBase Klasse bereitgestellt wird, die Settings unterschiedliche Endpunkte darstellt, mit denen die mobile eShopOnContainers-App eine Verbindung herstellt.

Datenbindung an Benutzereinstellungen

In der mobilen eShopOnContainers-App SettingsView werden zwei Benutzereinstellungen verfügbar gemacht. Diese Einstellungen ermöglichen die Konfiguration, ob die App Daten von Microservices abrufen soll, die als Docker-Container bereitgestellt werden, oder ob die App Daten aus simulierten Diensten abrufen soll, für die keine Internetverbindung erforderlich ist. Beim Abrufen von Daten aus containerisierten Microservices muss eine Basisendpunkt-URL für die Microservices angegeben werden. Abbildung 7-1 zeigt, wann sich der Benutzer für das SettingsView Abrufen von Daten aus containerisierten Microservices entschieden hat.

Benutzereinstellungen, die von der mobilen eShopOnContainers-App verfügbar gemacht werden

Abbildung 7-1: Benutzereinstellungen, die von der mobilen eShopOnContainers-App verfügbar gemacht werden

Die Datenbindung kann zum Abrufen und Festlegen von Einstellungen verwendet werden, die von der Settings Klasse verfügbar gemacht werden. Dies wird durch Steuerelemente in der Ansichtsbindung an Ansichtsmodelleigenschaften erreicht, die wiederum auf Eigenschaften in der Settings Klasse zugreifen und eine Eigenschaft geänderte Benachrichtigung auslösen, wenn sich der Einstellungswert geändert hat. Informationen dazu, wie die mobile eShopOnContainers-App Ansichtsmodelle erstellt und ansichten ordnet, finden Sie unter "Automatisches Erstellen eines Ansichtsmodells mit einem Ansichtsmodell-Locator".

Das folgende Codebeispiel zeigt das Entry Steuerelement aus dem SettingsView , mit dem der Benutzer eine Basisendpunkt-URL für die containerisierten Microservices eingeben kann:

<Entry Text="{Binding Endpoint, Mode=TwoWay}" />

Dieses Entry-Steuerelement wird mithilfe einer bidirektionalen Bindung an die Endpoint-Eigenschaft der SettingsViewModel-Klasse gebunden. Das folgende Codebeispiel zeigt die Endpoint-Eigenschaft:

public string Endpoint  
{  
    get { return _endpoint; }  
    set  
    {  
        _endpoint = value;  

        if(!string.IsNullOrEmpty(_endpoint))  
        {  
            UpdateEndpoint(_endpoint);  
        }  

        RaisePropertyChanged(() => Endpoint);  
    }  
}

Wenn die Endpoint Eigenschaft festgelegt wird, wird die UpdateEndpoint Methode aufgerufen, vorausgesetzt, der angegebene Wert ist gültig, und die Benachrichtigung über Eigenschaftsänderung wird ausgelöst. Die UpdateEndpoint-Methode wird in folgendem Codebeispiel veranschaulicht:

private void UpdateEndpoint(string endpoint)  
{  
    Settings.UrlBase = endpoint;  
}

Diese Methode aktualisiert die UrlBase Eigenschaft in der Settings Klasse mit dem vom Benutzer eingegebenen Basisendpunkt-URL-Wert, wodurch sie auf plattformspezifischen Speicher beibehalten wird.

Wenn die SettingsView Methode in der Klasse ausgeführt wird, InitializeAsync zu der SettingsViewModel navigiert wird. Im folgenden Codebeispiel wird diese Methode veranschaulicht:

public override Task InitializeAsync(object navigationData)  
{  
    ...  
    Endpoint = Settings.UrlBase;  
    ...  
}

Die Methode legt die Endpoint Eigenschaft auf den Wert der UrlBase Eigenschaft in der Settings Klasse fest. Der Zugriff auf die UrlBase Eigenschaft bewirkt, dass die Xam.Plugins.Settings-Bibliothek den Einstellungswert aus plattformspezifischem Speicher abruft. Informationen dazu, wie die Methode aufgerufen wird, finden Sie unter Übergeben von Parametern während der InitializeAsync Navigation.

Dieser Mechanismus stellt sicher, dass benutzer, wenn ein Benutzer zu SettingsView navigiert, von plattformspezifischem Speicher abgerufen und durch Datenbindung dargestellt werden. Wenn der Benutzer dann die Einstellungswerte ändert, stellt die Datenbindung sicher, dass sie sofort wieder auf plattformspezifischen Speicher zurückgehalten werden.

Zusammenfassung

Einstellungen ermöglichen die Trennung von Daten, die das Verhalten einer App mit Code konfigurieren, sodass das Verhalten geändert werden kann, ohne die App neu zu erstellen. App-Einstellungen sind Daten, die eine App erstellt und verwaltet, und Benutzereinstellungen sind die anpassbaren Einstellungen einer App, die sich auf das Verhalten der App auswirken und keine häufige Erneute Anpassung erfordern.

Die Xam.Plugins.Settings-Bibliothek bietet einen konsistenten, typsicheren, plattformübergreifenden Ansatz zum Beibehalten und Abrufen von App- und Benutzereinstellungen, und die Datenbindung kann verwendet werden, um auf einstellungen zuzugreifen, die mit der Bibliothek erstellt wurden.