1
3

More than 3 years have passed since last update.

MvvmCrossの概要

Last updated at Posted at 2020-02-24

MvvmCrossはCoreUIで構成されています。

  • Core
    • ViewModel、Service、Model、ビジネスロジック
    • .NET Standard library (バージョンが古い場合はPCLの可能性もあり・・)
  • UI
    • View、Coreと相互作用するためのプラットフォーム固有コード
    • ターゲットプラットフォームのネイティブプロジェクト

他にも、プロジェクトやアセンブリーを分けたりレイヤーを切り離して再使用性を向上したりすることもできます。

MvvmCrossのキーオブジェクト(Key objects)

MvvmCrossのキーオブジェクトの構成はこのような感じになります(あくまでも僕の感覚です)

fig

  1. プラットフォームのアプリ立ち上げプロセスが走ります(エントリーポイント)
  2. プラットフォームのアプリの構築中にUIパートのSetupオブジェクトが作成されます
  3. Setup.InitializePrimary:メインスレッドの実行+IoC、ロギングなどの初期化
  4. Setup.InitializeSecondary:バックグラウンドスレッドの実行+プラットフォームサービスの構築(バインディングなど)+AppオブジェクトのInitializeメソッドが呼ばれる+最後にView/ViewModelの登録の検索を行う
  5. App.Initializeが呼ばれるとAppStartオブジェクトで最初のナビゲーションを決めさせる。Setupの最後ステップとしてAppStart.Startup(object hint)が呼ばれる。
  6. 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)と混同しないように注意。

MvxApplication.cs

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

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3