読者です 読者をやめる 読者になる 読者になる

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

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

MVVMっぽくXamarin.Formsアプリ作ってみました。その5でおしまい

最後です。

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

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

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

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

前回まででXamarin.Forms本体のプロジェクト、そこコアロジックであるコントローラインターフェースへの実装、そして特定動作のライブラリ作成に関しての説明を行いました。

最後にこれらのライブラリをどのように結合しているかに関して説明します。

DependencyInjection

Xamarin.FormsのPCLプロジェクトで使用しているコントローラインターフェースに実装を注入するためにUnityを使用しています。

unity.codeplex.com

参照設定

まずは参照設定に関して説明します。

Xamarin.FormsのPCLプロジェクト

f:id:tamafuyou:20160422183333p:plain

コントローラインターフェースプロジェクト(SwLib.PCL)のみを参照設定しています。

このプロジェクトからは直接KeyValueStoreは使用しないため、それらは参照設定していません。

Xamarin.Android/Xamarin.iOSプロジェクト

f:id:tamafuyou:20160422183655p:plain

コントローラインターフェースとその実装、KeyValueStoreのインターフェースとその実装を参照設定しています。

コンテナーの利用

まずはUnityコンテナーにインターフェースと実装の登録を行います。

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

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

インターフェースに対する実装を登録いているだけです。 LifetimeManagerにContainerControlledLifetimeManagerを使用することでシングルトンとなります。 LifetimeManagerは割と簡単にカスタマイズできたり作ったりできたりするので拡張性がかなりあります。

そしてコンテナーをPCLプロジェクトに引き渡します。

PCLプロジェクトのApplicationクラスはIUnityContainerを引数としていて、コンストラクタにてContainerを使用してViewModelなどを作成します。

コンテナーを介してインスタンスを作成することで、ViewModelのコンストラクタ引数にコントローラの実装が注入されます。

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

プロジェクトの初期段階ではインターフェースしかなく実装がないため、UI担当者はインターフェースに対するモッククラスを作成しコンテナーに登録する形で作業を進めていました。

UIがある程度完成しコントローラに対する本物の実装も形になってきた段階で登録を置き換えることでコードの変更を殆ど行うことなくモックと本物の切り替えを行うことができます。

ちなみに、今回のサンプルではViewとViewModelの関連付けはコードで書いていますし、実際に作ったプロダクトでもコードで書いています。

これは規模が小さければ、そっちのほうが楽だと思ったからです。

同じViewModelのインスタンスを使ってViewを切り替えたりとか管理できる範囲だったらViewとViewModelをセットにしてしまうよりコートでゴリゴリしたほうが色々とできました。

最後に

結構中途半端な説明になってしまってしまいましたが、このような構成をベースにプロダクトを作成しました。

こういった解説に不慣れなためあまり良いコンテンツにできなかったのですが、自分の復習になった事、ページ遷移に関するネタなど色々と新たに学習できました。

Xamarin.Formsの実践投入においての、良くも悪くも一例として役に立ってくれればうれしいです。

以上