Xamarin.Forms(以下 XF とします)を本格的に開発に導入してみようと思ってるんだけど、その時のプロジェクト(アセンブリ)構成はこんな感じかな、というのを考えてみた。
角丸四角形がプロジェクトを、矢印は依存を示す。
左から説明。
Xamarin.Forms ソリューションを作成するとテンプレで作られるプロジェクト群。 XF.Core でプラットフォームに依存しないView(ボタンとか)を、XF.Android/XF.iOS でプラットフォーム固有のView(スライドメニューとかNotificationなど)を提供する。 これらは BindableProperty を介して ViewModel とデータバインディングする。 XF は他に、ServiceLocator や MessageCenter を提供するが、それらは使用しない(ロックインを防ぐため) 結局この案では、「XF=View層のみ」となる。
アプリのView以外の共通部分のプロジェクト。ViewModel と Model を含む。
ViewModel から View へシグナルを送るために "XFではない" Messengerを使う。(MvvmLight とか Prism とかから引っこ抜いてくればいいかな?)
Model にはビジネスロジックのみを記述し、通信処理やデータI/Oなどのプラットフォーム共通なAPIはModelから直接使い、プラットフォーム固有の機能は、ServiceInterface を使う。
ServiceInteface は、ServiceLocator によって App.Android/iOS から実体が Inject される。ServiceLocator は "XFではない"…以下略
Rx を使うので、たぶん Model のメソッドの返り値は全部 IObservable<T>
になります。
プラットフォーム固有のAPI層。例えば GPS とか、アプリ連携とか、アイテム課金とか。ServiceInterface に定義されている Interface を実装するところ。
IObservable<T>
化しようと思っているが、Callback→Observable変換をModelでやるか、API層でやるか。"ビジネス"ロジックではないので、右側かな。さて、どんなもんでしょ?