MvvmCrossはCoreとUIで構成されています。
- Core
- ViewModel、Service、Model、ビジネスロジック
- .NET Standard library (バージョンが古い場合はPCLの可能性もあり・・)
- UI
- View、Coreと相互作用するためのプラットフォーム固有コード
- ターゲットプラットフォームのネイティブプロジェクト
他にも、プロジェクトやアセンブリーを分けたりレイヤーを切り離して再使用性を向上したりすることもできます。
MvvmCrossのキーオブジェクト(Key objects)
MvvmCrossのキーオブジェクトの構成はこのような感じになります(あくまでも僕の感覚です)
- プラットフォームのアプリ立ち上げプロセスが走ります(エントリーポイント)
- プラットフォームのアプリの構築中にUIパートの
Setupオブジェクトが作成されます -
Setup.InitializePrimary:メインスレッドの実行+IoC、ロギングなどの初期化 -
Setup.InitializeSecondary:バックグラウンドスレッドの実行+プラットフォームサービスの構築(バインディングなど)+AppオブジェクトのInitializeメソッドが呼ばれる+最後にView/ViewModelの登録の検索を行う -
App.Initializeが呼ばれるとAppStartオブジェクトで最初のナビゲーションを決めさせる。Setupの最後ステップとしてAppStart.Startup(object hint)が呼ばれる。 -
AppStart.Startup(object hint)が実行され、最初のViewModel/Viewが表示される
hintパラメータを使って、UIパートからCoreパートに初期化パラメータを送ることができます。
プッシュ通知の実装などに使えます。
| オブジェクト名 | 概要 | Source Link |
|---|---|---|
| Setup | MvvmCrossアプリの構築 | MvxSetup.cs |
| App | Coreの初期化 | MvxApplication.cs |
| AppStart | 最初のViewModelの決定 | MvxAppStart |
Core projectのクラスの詳細説明
Appクラス
※Application(Android)やApplicationDelegate(iOS)と混同しないように注意。
CreateDefaultViewModelLocator メソッド
IMvxViewModelLocatorを返却する。ここで何もオーバーライドしなければMvxDefaultViewModelLocatorが使われる。
LoadPlugins メソッド
IMvxPluginManagerを引数にとって(おそらく)プラグインがロードされるタイミングで呼ばれる。
Initialize メソッド
バックグラウンドでの初期化をするときはここで行う。基本的にここに書くことになる。
ScaffoldやStarter Pack(今は無いらしい)を作成する時にすでに実装されている。
-
Serviceと最後についたインターフェイスをシングルトンとして登録するように実装されている。 -
RegisterAppStartで最初のViewModelを指定
Startup メソッド
UIスレッドでの初期化をするときにTaskを返却する。
baseメソッドでログが取られているので特に必要がなければbaseを呼ぶこと。
Reset メソッド
アプリケーションがリスタートされたときに呼ばれる。
リスタートされる時はもう一度Startupメソッドも呼ばれるが、その前に呼ばれるようになっているらしいので初回起動でない場合を検知できる。
(ソースにはAndroidの最初のアクティビティはリスタートされると書いてあるが詳細は不明)
FindViewModelLocator メソッド
MvxViewModelRequestを引数にとるが関係なしにデフォルトのロケータを探す。
RegisterAppStartメソッド系
-
RegisterCustomAppStart<TMvxAppStart>はカスタマイズしたAppStartを型引数に指定する。 -
RegisterAppStart<TViewModel>は型引数にViewModelを指定するとIoCにMvxAppStart<TViewModel>がシングルトンで登録される
Mvx.IoCProvider.ConstructAndRegisterSingleton<IMvxAppStart, MvxAppStart<TViewModel>>();
-
RegisterAppStart<TViewModel, TParameter>はパラメータ付きで渡せる (MvxAppStart<TViewModel, TParameter>がIoCに登録される)
CreateableTypes()メソッド系
-
CreatableTypes()は返り値はIEnumerable<Type>(通常Coreプロジェクトのアセンブリが入る) -
CreatableTypes(Assembly)は、アセンブリが指定できる
使用例はCustomizing App and Setupにて
MvxApplication<TParameter>クラス
詳細不明
クラスの型パラメータはTParameterを返すStartupメソッドの引数の型になっている。
ViewModel
- 変更を通知できるプロパティ
- コマンド
- 操作を管理するプライベートメソッド
ViewModelでできること
- リストを含める
- 他のViewModelへのナビゲーション
- 子のViewModelを含める
- IoCで構築する
- コンストラクタ、プロパティでのDI
- 定形コードを除くため
Fody.PropertyChanged(Github)を使う
詳しくは別記事にて(工事中)
Platform(UI) Projects
- ネイティブプラットフォームの初期コード
- カスタム
Setup.cs Views- カスタム
ViewPresenter - SDK依存コード
| プラットフォーム | ネイティブ | 初期化 | Setup |
|---|---|---|---|
| iOS | AppDelegate |
MvxApplicationDelegate.cs | MvxIosSetup.cs |
| macOS | AppDelegate |
MvxApplicationDelegate.cs | MvxMacSetup.cs |
| tvOS | AppDelegate |
MvxApplicationDelegate.cs | MvxTvosSetup.cs |
| Android | Application |
MvxAndroidApplication.cs | MvxAndroidSetup.cs |
| Android(Support) | Application |
MvxAppCompatApplication.cs#4ab0a89437 | MvxAppCompatSetup.cs#4ab0a89437 |
| WPF | App.xaml.cs |
MvxApplication.cs | MvxWpfSetup.cs |
| UWP | App.xaml.cs |
MvxApplication.cs | MvxWindowsSetup.cs |
Views
命名規則から、Viewの名前はViewModelに関連付けられる
ジェネリクスで
public class MyView : MvxViewController<MyViewModel>
とすることもできる。
View Presenters
ViewModelファーストなナビゲーションシステムの根本はView Presenterによるもの。そして、カスタマイズも高度にできる。