眠いしお腹すいたし(´・ω・`)

C#関連を主に書きます。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

MVVMっぽくXamarin.Formsアプリ作ってみました。その4

続きです。

MVVMっぽくXamarin.Formsアプリ作ってみました。その1 - 眠いしお腹すいたし(´・ω・`)

MVVMっぽくXamarin.Formsアプリ作ってみました。その2 - 眠いしお腹すいたし(´・ω・`)

MVVMっぽくXamarin.Formsアプリ作ってみました。その3 - 眠いしお腹すいたし(´・ω・`)

コントローラインターフェースの実装

f:id:tamafuyou:20160418224824p:plain

この画像の構成はPCLブロジェクトにて行われていますが、コントローラインターフェースの実装はPCLでは行っていません。

GitHub - yuka1984/XamarinFormsSampleStopWatch: Xamarin.Formsサンプルアプリ

今回のサンプルアプリではコントローラインターフェースはPCLプロジェクトのSwLib.Interfaceで作成していますが、インターフェースに対する実装はSwLib.Core、SwLib.Core.Droid、SwLib.Core.Touchで行っています。

SwLib.Coreは普通のクラスライブラリプロジェクト f:id:tamafuyou:20160421202205p:plain

SwLib.Core.DroidはAndroid用クラスライブラリプロジェクト f:id:tamafuyou:20160421201528p:plain

Swlib.Core.TouchはiOS用クラスライブラリプロジェクトになります。 f:id:tamafuyou:20160421201845p:plain

これから説明する方法はUWPプロジェクトへの展開を意識していません。

あくまでもAndroidiOSをターゲットとしたクラスライブラリの作成方法となります。

私は以下の手順でコントローラの実装を行っています。

  1. クラスライブラリプロジェクト(SwLib.Core)を作成してインターフェースを宣言しているPCL(SwLib.Interface)を参照設定する。
  2. インターフェースに対する実装クラスを作成する。
  3. 作成したクラスの単体テストSwLib.CoreTestsを作成して試験を行う。
  4. Androidクラスライブラリ(SwLib.Core.Droid)を作成してPCLを参照設定する。
  5. SwLib.Coreの.csファイルをリンクとしてSwLib.Core.Droidに追加する。 f:id:tamafuyou:20160421203624p:plain
  6. iOSクラスライブラリ(SwLib.Core.Touch)を作成してPCLを参照設定する。
  7. SwLib.Coreの.csファイルをリンクとしてSwLib.Core.Touchに追加する。

SwLib.Coreの実装では普通のライブラリプロジェクトとAndroidiOSのプロジェクトですべてファイルが一緒ですが、例えばコントローラインターフェースが複数あって一つのインターフェースに対してWindowsiOSは共通だけどAndroidに関してはJavaを使って実装するなどという場合には、そのクラスの実装はリンク追加せずAndroidプロジェクトで実装を行います。

このような実装手順とプロジェクト構成はコントローラインターフェースだけでなく、共通化クラスにも適応します。

例としてKeyValueStoreというライブラリ実装を用意しました。

KeyValueStoreの実装

KeyValueStoreと言っていますが、簡易のデータ保存ストアです。

プロジェクト構成は

KeyValueStore.PCLはIKeyValueStoreというインターフェースを持っています。

KeyValueStore.CoreはIKeyValueStoreの.NET46用実装です。

KeyValueStore.Core.DroidはIKeyValueStoreのAndroid実装です。

KeyValueStore.Core.TouchはIKeyValueStoreのiOS実装です。

このライブラリはNuGet Gallery | SQLite.Net PCL 3.1.1を使用してIKeyValueStoreに対する実装を行っています。

Windowsクラスライブラリのファイルは3つ

XamarinFormsSampleStopWatch/Kvs.cs at master · yuka1984/XamarinFormsSampleStopWatch · GitHub

SQLiteのテーブルのマッピング用クラスです。

XamarinFormsSampleStopWatch/KeyValueStoreBase.cs at master · yuka1984/XamarinFormsSampleStopWatch · GitHub

IKeyValueStoreに対するabstractの実装です。

各プラットフォームで差分がない部分を実装して差分をabstractとしています。

XamarinFormsSampleStopWatch/KeyValueStore.cs at master · yuka1984/XamarinFormsSampleStopWatch · GitHub

KeyValueStoreBaseのWindows用実装です。

Kvs.csとKeyValueStoreBaseはAndroid/iOSプロジェクトへリンク追加しますが、KeyValueStore.csはリンク追加せず、それぞれのプロジェクトで作成しています。

XamarinFormsSampleStopWatch/KeyValueStore.cs at master · yuka1984/XamarinFormsSampleStopWatch · GitHub

XamarinFormsSampleStopWatch/KeyValueStore.cs at master · yuka1984/XamarinFormsSampleStopWatch · GitHub

このプロジェクトではあまり実装に差分はありません。

DependencyInjectionを使用すれば吸収できる範囲だとは思います。

KeyValueStoreというプロジェクトを単独で切り離せる用にするために、このような形となっています。

今回のサンプルではXamarin.FormsプロジェクトとSwLib、KeyValueStoreを一つのソリューションで開発していますが、それぞれを別のソリューションで作成する事も可能な依存関係となっています。

ソリューションを分けた上でローカルnugetを使用した結合を行いXamarin.Formsアプリのソリューション自体を小さくすることができたりしますしロース管理のリポジトリを分けて開発することもできます。

今回は以上です。

次回、再度Xamarin.Formsプロジェクトに戻ってDIContainerに関して説明を行って終了にしたいと思います。

毎度細切れで申し訳ありません('ω')