設定管理

提示

本內容節錄自《Enterprise Application Patterns Using .NET MAUI》電子書,可以從 .NET Docs 取得,也可以免費下載 PDF 離線閱讀。

Enterprise Application Patterns Using .NET MAUI eBook cover thumbnail.

設定允許區隔可設定應用程式與程式碼行為的資料,並允許變更行為,而不需要重建應用程式。 有兩種類型的設定:應用程式設定和使用者設定。

應用程式設定是應用程式所建立和管理的資料。 其可以包括固定 Web 服務端點、API 金鑰和執行階段狀態這類資料。 應用程式設定會繫結至核心功能,而且只對該應用程式有意義。

使用者設定是應用程式的可自訂設定,而這些設定會影響應用程式的行為,而且不需要經常重新調整。 例如,應用程式可能會讓使用者指定資料擷取位置,以及如何將其顯示在畫面上。

建立設定介面

雖然喜好設定管理員可以直接用於應用程式,但其缺點是讓應用程式緊密結合至喜好設定管理員實作。 這種結合表示建立單元測試或擴充喜好設定管理功能將會受到限制,因為您的應用程式將無法直接攔截行為。 若要解決此問題,可以建立介面,以作為喜好設定管理的 Proxy。 介面將可讓我們提供符合需求的實作。 例如,撰寫單元測試時,建議設定特定設定,而介面將會提供簡單的方式來一致地設定此測試資料。 下列程式碼範例顯示 eShopOnContainers 多平台應用程式中的 ISettingsService 介面:

namespace eShopOnContainers.Services.Settings;

public interface ISettingsService
{
    string AuthAccessToken { get; set; }
    string AuthIdToken { get; set; }
    bool UseMocks { get; set; }
    string IdentityEndpointBase { get; set; }
    string GatewayShoppingEndpointBase { get; set; }
    string GatewayMarketingEndpointBase { get; set; }
    bool UseFakeLocation { get; set; }
    string Latitude { get; set; }
    string Longitude { get; set; }
    bool AllowGpsLocation { get; set; }
}

新增設定

.NET MAUI 包括喜好設定管理員,以提供儲存使用者執行階段設定的方式。 您可以使用 Microsoft.Maui.Storage.Preferences 類別,從應用程式內的任何位置存取這項功能。 喜好設定管理員提供一致的類型安全跨平台方式來持續保存和擷取應用程式和使用者設定,同時使用每個平台所提供的原生設定管理。 此外,使用資料繫結來存取程式庫所公開的設定資料十分簡單。 如需詳細資訊,請參閱 Microsoft 開發人員中心上的喜好設定

提示

喜好設定用來儲存相當小的資料。 如果您需要儲存較大或更複雜的資料,則請考慮使用本機資料庫或檔案系統來儲存資料。

我們的應用程式將會使用 Preferences 類別來實作 ISettingsService 介面。 下列程式碼顯示 eShopOnContainers 多平台應用程式的 SettingsService 如何實作 AuthTokenAccessUseMocks 屬性:

public sealed class SettingsService : ISettingsService
{
    private const string AccessToken = "access_token";
    private const string AccessTokenDefault = string.Empty;

    private const string IdUseMocks = "use_mocks";
    private const bool UseMocksDefault = true;

    public string AuthAccessToken
    {
        get => Preferences.Get(AccessToken, AccessTokenDefault);
        set => Preferences.Set(AccessToken, value);
    }

    public bool UseMocks
    {
        get => Preferences.Get(IdUseMocks, UseMocksDefault);
        set => Preferences.Set(IdUseMocks, value);
    }
}

每個設定都會包含私密金鑰、私人預設值和公用屬性。 金鑰一律是可定義唯一名稱的常數字串,而且設定的預設值是必要類型的靜態唯讀或常數值。 提供預設值可確保擷取取消設定的設定時可以使用有效值。 此服務實作可以透過相依性插入提供給應用程式,以用於整個應用程式中的檢視模型或其他服務。

資料繫結至使用者設定

在 eShopOnContainers 多平台應用程式中,SettingsView 會公開使用者可在執行階段設定的多個設定。 這些設定包括允許設定應用程式是否應該從部署為 Docker 容器的微服務擷取資料,或應用程式是否應該從不需要網際網路連線的模擬服務擷取資料。 從容器化微服務擷取資料時,必須指定微服務的基底端點 URL。 下圖顯示使用者已選擇從容器化微服務擷取資料時的 SettingsView。

User settings exposed by the eShopOnContainers multi-platform app.

資料繫結可以用來擷取和設定 ISettingService 介面所公開的設定。 作法是透過檢視繫結上的控制項來檢視模型屬性,進而存取 ISettingService 介面中的屬性,並在值變更時引發屬性變更通知。

下列程式碼範例顯示 SettingsViewEntry 控制項,而此控制項允許使用者輸入容器化微服務的基底身分識別端點 URL:

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

Entry 控制項會使用雙向繫結以繫結至 SettingsViewModel 類別的 IdentityEndpoint 屬性。 下列程式碼範例顯示 IdentityEndpoint 屬性:

private readonly ISettingsService _settingsService;

private string _identityEndpoint;

public SettingsViewModel(
    ILocationService locationService, IAppEnvironmentService appEnvironmentService,
    IDialogService dialogService, INavigationService navigationService, ISettingsService settingsService)
    : base(dialogService, navigationService, settingsService)
{
    _settingsService = settingsService;

    _identityEndpoint = _settingsService.IdentityEndpointBase;
}

public string IdentityEndpoint
{
    get => _identityEndpoint;
    set
    {
        SetProperty(ref _identityEndpoint, value);

        if (!string.IsNullOrWhiteSpace(value))
        {
            UpdateIdentityEndpoint();
        }
    }
}

設定 IdentityEndpoint 屬性時,只要提供的值有效,就會呼叫 UpdateIdentityEndpoint 方法。 下列程式碼範例示範 UpdateIdentityEndpoint 方法:

private void UpdateIdentityEndpoint()
{
    _settingsService.IdentityEndpointBase = _identityEndpoint;
}

此方法會使用使用者所輸入的基底端點 URL 值來更新 ISettingService 介面實作中的 IdentityEndpointBase 屬性。 如果 SettingsService 類別提供為 _settingsService 的實作,則值將會持續保存至平台特定儲存區。

摘要

設定允許區隔可設定應用程式與程式碼行為的資料,並允許變更行為,而不需要重建應用程式。 應用程式設定是應用程式所建立和管理的資料,而使用者設定是應用程式的可自訂設定,而這些設定會影響應用程式的行為,而且不需要經常重新調整。

Microsoft.Maui.Storage.Preferences 類別提供一致的類型安全跨平台方法來持續保存和擷取應用程式和使用者設定。