MVVMっぽくXamarin.Formsアプリ作ってみました。その4
続きです。
MVVMっぽくXamarin.Formsアプリ作ってみました。その1 - 眠いしお腹すいたし(´・ω・`)
MVVMっぽくXamarin.Formsアプリ作ってみました。その2 - 眠いしお腹すいたし(´・ω・`)
MVVMっぽくXamarin.Formsアプリ作ってみました。その3 - 眠いしお腹すいたし(´・ω・`)
コントローラインターフェースの実装
この画像の構成はPCLブロジェクトにて行われていますが、コントローラインターフェースの実装はPCLでは行っていません。
GitHub - yuka1984/XamarinFormsSampleStopWatch: Xamarin.Formsサンプルアプリ
今回のサンプルアプリではコントローラインターフェースはPCLプロジェクトのSwLib.Interfaceで作成していますが、インターフェースに対する実装はSwLib.Core、SwLib.Core.Droid、SwLib.Core.Touchで行っています。
SwLib.Coreは普通のクラスライブラリプロジェクト
SwLib.Core.DroidはAndroid用クラスライブラリプロジェクト
Swlib.Core.TouchはiOS用クラスライブラリプロジェクトになります。
これから説明する方法はUWPプロジェクトへの展開を意識していません。
あくまでもAndroidとiOSをターゲットとしたクラスライブラリの作成方法となります。
私は以下の手順でコントローラの実装を行っています。
- クラスライブラリプロジェクト(SwLib.Core)を作成してインターフェースを宣言しているPCL(SwLib.Interface)を参照設定する。
- インターフェースに対する実装クラスを作成する。
- 作成したクラスの単体テストSwLib.CoreTestsを作成して試験を行う。
- Androidクラスライブラリ(SwLib.Core.Droid)を作成してPCLを参照設定する。
- SwLib.Coreの.csファイルをリンクとしてSwLib.Core.Droidに追加する。
- iOSクラスライブラリ(SwLib.Core.Touch)を作成してPCLを参照設定する。
- SwLib.Coreの.csファイルをリンクとしてSwLib.Core.Touchに追加する。
SwLib.Coreの実装では普通のライブラリプロジェクトとAndroid、iOSのプロジェクトですべてファイルが一緒ですが、例えばコントローラインターフェースが複数あって一つのインターフェースに対してWindowsとiOSは共通だけど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
IKeyValueStoreに対するabstractの実装です。
各プラットフォームで差分がない部分を実装して差分をabstractとしています。
KeyValueStoreBaseのWindows用実装です。
Kvs.csとKeyValueStoreBaseはAndroid/iOSプロジェクトへリンク追加しますが、KeyValueStore.csはリンク追加せず、それぞれのプロジェクトで作成しています。
このプロジェクトではあまり実装に差分はありません。
DependencyInjectionを使用すれば吸収できる範囲だとは思います。
KeyValueStoreというプロジェクトを単独で切り離せる用にするために、このような形となっています。
今回のサンプルではXamarin.FormsプロジェクトとSwLib、KeyValueStoreを一つのソリューションで開発していますが、それぞれを別のソリューションで作成する事も可能な依存関係となっています。
ソリューションを分けた上でローカルnugetを使用した結合を行いXamarin.Formsアプリのソリューション自体を小さくすることができたりしますしロース管理のリポジトリを分けて開発することもできます。
今回は以上です。
次回、再度Xamarin.Formsプロジェクトに戻ってDIContainerに関して説明を行って終了にしたいと思います。
毎度細切れで申し訳ありません('ω')