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によるもの。そして、カスタマイズも高度にできる。