組態管理
注意
本電子書於 2017 年春季出版,此後尚未更新。 這本書中有很多仍然有價值的,但一些材料已經過時。
設定允許區隔可設定應用程式與程式碼行為的資料,並允許變更行為,而不需要重建應用程式。 有兩種類型的設定:應用程式設定和用戶設定。
應用程式設定是應用程式所建立和管理的資料。 其可以包括固定 Web 服務端點、API 金鑰和執行階段狀態這類資料。 應用程式設定會系結至應用程式的存在,而且只對該應用程式有意義。
用戶設定是會影響應用程式行為的應用程式可自定義設定,而且不需要頻繁重新調整。 例如,應用程式可能會讓使用者指定要從何處擷取數據,以及如何在畫面上顯示數據。
Xamarin.Forms 包含可用來儲存設定數據的永續性字典。 您可以使用 屬性來存取 Application.Current.Properties
此字典,而且當應用程式進入睡眠狀態時,會儲存放入其中的任何數據,並在應用程式繼續或重新啟動時還原。 此外,類別 Application
也有方法 SavePropertiesAsync
可讓應用程式在必要時儲存其設定。 如需此字典的詳細資訊,請參閱 屬性字典。
使用 Xamarin.Forms 永續性字典儲存數據的缺點是它不容易系結至的數據。 因此,eShopOnContainers 行動應用程式會使用 NuGet 提供的 Xam.Plugins.Settings 連結庫。 此連結庫提供一致、類型安全、跨平臺的方法,可用來保存和擷取應用程式和使用者設定,同時使用每個平臺所提供的原生設定管理。 此外,使用資料繫結來存取程式庫所公開的設定資料十分簡單。
注意
雖然 Xam.Plugin.Settings 連結庫可以同時儲存應用程式和用戶設定,但它不會區分這兩者。
建立設定類別
使用 Xam.Plugins.Settings 連結庫時,應該建立單一靜態類別,其中包含應用程式所需的應用程式和用戶設定。 下列程式代碼範例顯示 eShopOnContainers 行動應用程式中的 Settings 類別:
public static class Settings
{
private static ISettings AppSettings
{
get
{
return CrossSettings.Current;
}
}
...
}
設定可以透過 ISettings
API 讀取和寫入,此 API 是由 Xam.Plugins.Settings 連結庫提供。 此連結庫提供單一連結庫,可用來存取 API, CrossSettings.Current
而應用程式的設定類別應該透過 屬性公開此單一 ISettings
。
注意
應該將 Plugin.Settings 和 Plugin.Settings.Abstractions 命名空間的 Using 指示詞新增至需要存取 Xam.Plugins.Settings 連結庫類型的類別。
新增設定
每個設定都包含索引鍵、預設值和屬性。 下列程式代碼範例顯示使用者設定的所有三個專案,代表 eShopOnContainers 行動應用程式所連線之 線上服務 的基底 URL:
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);
}
}
}
索引鍵一律是定義密鑰名稱的常數位符串,而設定的預設值是必要類型的靜態只讀值。 提供預設值可確保擷取取消設定的設定時可以使用有效值。
UrlBase
靜態屬性會使用 API 中的ISettings
兩種方法來讀取或寫入設定值。 方法 ISettings.GetValueOrDefault
可用來從平臺特定記憶體擷取設定的值。 如果未為設定定義任何值,則會改為擷取其預設值。 同樣地,方法 ISettings.AddOrUpdateValue
可用來將設定的值保存到平臺特定的記憶體。
字串會在 類別內 Settings
定義預設值, UrlBaseDefault
而是從 GlobalSetting
類別取得其值。 下列程式代碼範例顯示 BaseEndpoint
這個類別中的 屬性和 UpdateEndpoint
方法:
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);
}
}
每次設定 屬性時 BaseEndpoint
,都會 UpdateEndpoint
呼叫 方法。 這個方法會更新一系列屬性,這些屬性都是以類別所提供的Settings
使用者設定為基礎UrlBase
,這些設定代表 eShopOnContainers 行動應用程式所連線的不同端點。
數據系結至用戶設定
在 eShopOnContainers 行動裝置應用程式中,會 SettingsView
公開兩個用戶設定。 這些設定可設定應用程式是否應該從部署為 Docker 容器的微服務擷取數據,或應用程式是否應該從不需要因特網連線的模擬服務擷取數據。 選擇從容器化微服務擷取數據時,必須指定微服務的基底端點 URL。 圖 7-1 顯示 SettingsView
使用者選擇從容器化微服務擷取資料時的 。
圖 7-1:eShopOnContainers 行動裝置應用程式公開的用戶設定
數據系結可用來擷取和設定 類別公開的 Settings
設定。 這可透過檢視系結上的控件來檢視類別中存取屬性的 Settings
模型屬性,並在設定值變更時引發屬性變更通知。 如需 eShopOnContainers 行動應用程式如何建構檢視模型並將其與檢視產生關聯的資訊,請參閱 使用檢視模型定位器自動建立檢視模型。
下列程式代碼範例顯示 Entry
的控件 SettingsView
,可讓使用者輸入容器化微服務的基底端點 URL:
<Entry Text="{Binding Endpoint, Mode=TwoWay}" />
此 Entry
控制項會使用雙向繫結以繫結至 SettingsViewModel
類別的 Endpoint
屬性。 下列程式代碼範例顯示 Endpoint 屬性:
public string Endpoint
{
get { return _endpoint; }
set
{
_endpoint = value;
if(!string.IsNullOrEmpty(_endpoint))
{
UpdateEndpoint(_endpoint);
}
RaisePropertyChanged(() => Endpoint);
}
}
Endpoint
設定 屬性UpdateEndpoint
時,會呼叫 方法,前提是提供的值有效,而且會引發屬性變更通知。 下列程式碼範例示範 UpdateEndpoint
方法:
private void UpdateEndpoint(string endpoint)
{
Settings.UrlBase = endpoint;
}
這個方法會 UrlBase
使用使用者輸入的基底端點 URL 值來更新 類別中的 Settings
屬性,這會導致它保存到平臺特定的記憶體。
SettingsView
巡覽至 時,InitializeAsync
會執行 類別中的 SettingsViewModel
方法。 下列程式碼範例示範此方法:
public override Task InitializeAsync(object navigationData)
{
...
Endpoint = Settings.UrlBase;
...
}
方法會將 Endpoint
屬性設定為 類別中 Settings
屬性的值UrlBase
。 存取 UrlBase
屬性會導致 Xam.Plugins.Settings 連結庫從平臺特定記憶體擷取設定值。 如需如何叫 InitializeAsync
用方法的相關信息,請參閱 在導覽期間傳遞參數。
此機制可確保每當用戶流覽至 SettingsView 時,就會從平臺特定記憶體擷取使用者設定,並透過數據系結呈現。 然後,如果使用者變更設定值,數據系結可確保它們會立即保存回平臺特定的記憶體。
摘要
設定允許區隔可設定應用程式與程式碼行為的資料,並允許變更行為,而不需要重建應用程式。 應用程式設定是應用程式所建立和管理的數據,而使用者設定是影響應用程式行為且不需要頻繁重新調整的應用程式可自定義設定。
Xam.Plugins.Settings 連結庫提供一致、型別安全、跨平臺方法來保存和擷取應用程式和使用者設定,以及數據系結可用來存取使用連結庫建立的設定。