構成管理
Note
この電子ブックは 2017 年の春に発行され、それ以来更新されていません。 貴重なままの本に多くがありますが、資料の一部は時代遅れです。
設定を使用すると、アプリの動作を構成するデータをコードから分離できるため、アプリを再構築せずに動作を変更できます。 設定には、アプリ設定とユーザー設定の 2 種類があります。
アプリ設定は、アプリが作成および管理するデータです。 これには、固定 Web サービス エンドポイント、API キー、ランタイム状態などのデータを含めることができます。 アプリの設定はアプリの存在に関連付けられており、そのアプリに対してのみ意味があります。
ユーザー設定は、アプリの動作に影響を与え、頻繁に再調整を必要としない、アプリのカスタマイズ可能な設定です。 たとえば、アプリでは、ユーザーがデータを取得する場所と、画面に表示する方法を指定できます。
Xamarin.Forms には、設定データを格納するために使用できる永続的なディクショナリが含まれています。 このディクショナリには、 プロパティを Application.Current.Properties
使用してアクセスできます。このディクショナリに配置されたデータは、アプリがスリープ状態になったときに保存され、アプリが再開または起動したときに復元されます。 さらに、 Application
クラスには SavePropertiesAsync
、アプリが必要に応じて設定を保存できるようにする メソッドもあります。 このディクショナリの詳細については、「 Properties Dictionary」を参照してください。
永続ディクショナリを使用して Xamarin.Forms データを格納する欠点は、データがバインドされにくいということです。 そのため、eShopOnContainers モバイル アプリでは、 NuGet から入手できる Xam.Plugins.Settings ライブラリが使用されます。 このライブラリは、各プラットフォームで提供されるネイティブ設定管理を使用しながら、アプリとユーザーの設定を永続化および取得するための一貫性のあるタイプセーフなクロスプラットフォーム アプローチを提供します。 さらに、データ バインディングを使用して、ライブラリによって公開される設定データに簡単にアクセスできます。
注意
Xam.Plugin.Settings ライブラリではアプリとユーザーの両方の設定を格納できますが、この 2 つの設定は区別されません。
設定クラスの作成
Xam.Plugins.Settings ライブラリを使用する場合は、アプリに必要なアプリとユーザー設定を含む 1 つの静的クラスを作成する必要があります。 次のコード例は、eShopOnContainers モバイル アプリの Settings クラスを示しています。
public static class Settings
{
private static ISettings AppSettings
{
get
{
return CrossSettings.Current;
}
}
...
}
設定は、Xam.Plugins.Settings ライブラリによって提供される API を使用して ISettings
読み書きできます。 このライブラリは、API、 CrossSettings.Current
、 にアクセスするために使用できるシングルトンを提供します。アプリの設定クラスは、 プロパティを介してこのシングルトンを公開する ISettings
必要があります。
注意
Plugin.Settings および Plugin.Settings.Abstractions 名前空間の using ディレクティブは、Xam.Plugins.Settings ライブラリ型へのアクセスを必要とするクラスに追加する必要があります。
設定の追加
各設定は、キー、既定値、およびプロパティで構成されます。 次のコード例は、eShopOnContainers モバイル アプリが接続するオンライン サービスのベース URL を表すユーザー設定の 3 つの項目すべてを示しています。
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);
}
}
}
キーは常に、キー名を定義する const 文字列であり、設定の既定値は、必要な型の静的読み取り専用値です。 既定値を指定すると、未設定の設定が取得された場合に有効な値を使用できるようになります。
静的プロパティは UrlBase
、API の 2 つのメソッドを 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
呼び出されます。 このメソッドは一連のプロパティを更新します。これらはすべて、eShopOnContainers モバイル アプリが接続するさまざまなエンドポイントを表す クラスによってSettings
提供されるユーザー設定に基づいていますUrlBase
。
ユーザー設定へのデータ バインディング
eShopOnContainers モバイル アプリでは、 によって SettingsView
2 つのユーザー設定が公開されます。 これらの設定を使用すると、アプリが Docker コンテナーとしてデプロイされたマイクロサービスからデータを取得する必要があるかどうか、またはアプリがインターネット接続を必要としないモック サービスからデータを取得する必要があるかどうかを構成できます。 コンテナー化されたマイクロサービスからデータを取得する場合は、マイクロサービスのベース エンドポイント URL を指定する必要があります。 図 7-1 は、ユーザーがコンテナー化されたマイクロサービスからデータを取得することを選択したタイミングを示しています SettingsView
。
図 7-1: eShopOnContainers モバイル アプリによって公開されるユーザー設定
データ バインディングを使用して、 クラスによって公開される設定を Settings
取得および設定できます。 これは、ビュー バインドのコントロールによって、クラスのプロパティ Settings
にアクセスするモデル プロパティを表示し、設定値が変更された場合にプロパティ変更通知を生成することによって実現されます。 eShopOnContainers モバイル アプリがビュー モデルを構築してビューに関連付ける方法の詳細については、「ビュー モデルロケーターを使用してビュー モデルを自動的に作成する」を参照してください。
次のコード例は、 のSettingsView
コントロールをEntry
示しています。これにより、ユーザーはコンテナー化されたマイクロサービスのベース エンドポイント 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;
}
このメソッドは、 クラスの Settings
プロパティを、ユーザーが入力したベース エンドポイント URL 値で更新UrlBase
します。これにより、プラットフォーム固有のストレージに永続化されます。
に SettingsView
移動すると、 クラスの InitializeAsync
SettingsViewModel
メソッドが実行されます。 以下のコード例はこのメソッドを示しています。
public override Task InitializeAsync(object navigationData)
{
...
Endpoint = Settings.UrlBase;
...
}
メソッドは、 プロパティを Endpoint
クラスの プロパティの UrlBase
値に Settings
設定します。 プロパティに UrlBase
アクセスすると、Xam.Plugins.Settings ライブラリがプラットフォーム固有のストレージから設定値を取得します。 メソッドの呼び出し方法の詳細については、「ナビゲーション中にパラメーターをInitializeAsync
渡す」を参照してください。
このメカニズムにより、ユーザーが SettingsView に移動するたびに、ユーザー設定がプラットフォーム固有のストレージから取得され、データ バインディングによって表示されるようになります。 その後、ユーザーが設定値を変更すると、データ バインディングによって、プラットフォーム固有のストレージにすぐに永続化されるようになります。
まとめ
設定を使用すると、アプリの動作を構成するデータをコードから分離できるため、アプリを再構築せずに動作を変更できます。 アプリの設定はアプリによって作成および管理されるデータであり、ユーザー設定はアプリの動作に影響を与え、頻繁に再調整を必要としないアプリのカスタマイズ可能な設定です。
Xam.Plugins.Settings ライブラリは、アプリとユーザーの設定を永続化および取得するための一貫したタイプ セーフなクロスプラットフォーム アプローチを提供し、データ バインディングを使用してライブラリで作成された設定にアクセスできます。