しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

MVPVM のテンプレートを作ってみました(1)

(1)がついているのはまだ発展途上だからです!

tatsuji-kuroyanagi/MVPVMTemplates · GitHub

プロジェクトテンプレートと項目テンプレートを作ってみました

ドキュメントライブラリの Visual Studio 2013/Templates フォルダ配下にコピーすれば使えるはず!

f:id:matatabi_ux:20140202195956p:plain

うまくいっていれば、プロジェクトの新規作成メニューにネコアイコンの MVPVM プロジェクトが追加されます

f:id:matatabi_ux:20140202200010p:plain

この MVPVM プロジェクト専用ですが Model 用 Entity、ViewModel、Page/ViewModel/Presenter が1組生成される MVPVM 基本ページも作成できるようになります

まだ発展途上でテンプレートで吸収しきれなかったため、残念ながら項目作成後 MainPresenter.cs に追加の記述が必要です

/// <summary>
/// 初期化処理
/// </summary>
public void Initialize()
{
    this.View = App.Current as App;

    // セッション情報のシリアライズのために保存クラスを SuspensionManager に共有する
    SuspensionManager.KnownTypes.Add(typeof(BindableBase));
    SuspensionManager.KnownTypes.Add(typeof(ViewModelBase));
    SuspensionManager.KnownTypes.Add(typeof(MainViewModel));
    SuspensionManager.KnownTypes.Add(typeof(TopPageViewModel));

    this.View.Suspending += this.OnSuspending;

    ServiceLocator.SetLocatorProvider(() => ModuleContainer.Instance);

    ModuleContainer.Instance.Register<ApplicationSettingsModel>();

    PresenterLocator.Set<MainPresenter>(this);

    // Presenter と Page のひもづけ
    PresenterLocator.Register<TopPagePresenter, TopPage>();

    this.ViewModel.Initialize();
}

MainPresenter の Initialize メソッド内で、サスペンド時にシリアライズする ViewModel のクラスを SuspensionManager.KnownTypes に追加することと、PresenterLocator に Presenter と View のクラスの関連付けを登録しておく必要があります

他にもいろいろありますが、あとは実際のコードを見てもらった方がよいかなと思います

各所で酷評されている MVPVM アーキテクチャですが、個人的には下記の点でストアアプリ開発に役立つのではないかと思っています

  • Presenter が手続き的な処理を担当できるので ViewModel から Command が不要になる

  • View に Command の I/F が不要になり、イベントハンドラから直接 Presenter を呼び出せる

  • Presenter が View と ViewModel を参照するので Messenger が不要になる

  • Presenter を見るだけで処理の流れがつかみやすい

自分の利用の仕方だと、コントロールのイベントハンドラの仕組みをそのまま利用できるため Command を利用せずに View のイベントハンドラから Presenter を呼び出します

UnitTest の実施などで必要があれば View - Presenter - ViewModel の間をインタフェースで抽象化します

厳密にレイヤー分割をするのを良しと考える方からすると怒られそうですが、自分が携わるストアアプリ開発では WPF 案件などと比べ短納期なものが多い傾向があるので、重厚長大で厳密なアーキテクチャだと開発が軌道にのるまでの時間がかかりすぎて向いていなかったのです;

お話を頂いてから1週間以内で納品などということもある中で、Command や Messenger、その他レイヤー分割のための各種 フレームワークを準備している余裕などなく・・・そんな状況だと MVPVM は魅力的に感じます

できる限りすでにあるものを生かす軽量なフレームワークでアプリの本質の部分の実装に早期に着手でき、Model、View、Presenter、ViewModel のどれかにコード量が偏らずに実装できるような気がするからです

MVPVM はあまり普及が進んでいないらしくこれが正しい利用の仕方なのかどうかもよくわからないですが、個人的には ViewModel に Command は違和感があるのでしばらくはこのテンプレートを活用しながら見極めたいと思っています