質問: 現在、 WPF + Prism + ReactiveProperty で MVVM を勉強中です。 元々 Livet を使ってでWPFアプリを作ったことはあるのですが、現在の主流?が Prism + ReactiveProperty ということで、勉強しなおしているところです。 そこで気になった点がありますので、質問させていただきます。 Model は最低2レイヤー構成となるのか? ----------------------- Prism + ReactiveProperty で Model 層を実装すると、Model 層側で `BindableBase` を継承したクラスを用意し、それらにゲッターセッタープロパティを持たせることになると思います。 そこで違和感があったのですが、そもそも `BindableBase` という関心ごとは MVVM を実現するための機能であり、本来の業務ロジックとは異なります。また、クラスにゲッターセッタープロパティを持たせるとカプセル化を破壊することにつながる恐れがあると考えます。(一般的に、業務ロジックを扱うドメイン層では、ゲッターはまだしもセッターは極力使うべきではないと考えています) となると、`BindableBase` を継承したクラスは、対 ViewModel 向けの関心ごとを保持していることになるので、もはや MVVM の本来の目的である「ビューからモデル層を独立させる」ということが達成できていないのではと違和感を覚えました。 それを解決するためには、モデル層を以下の最低2レイヤー構成にするほうがいいのか?と思ってきました。 * 「対 ViewModel 向けの `BindableBase` を継承したゲッターセッタープロパティを保持するクラス」を扱うレイヤー(つまりViewModelを向けにドメインオブジェクトを加工するレイヤー) * 純粋な業務ロジックや、いわゆるインフラ層(ここはプロジェクトや問題の複雑度により任意数のレイヤーとなる) んなわけないですよね? ------------ 自分で書いていてなんですが、ググってもそんな記事見つからないので、上記の疑問は根本から間違っているのかなと思います。 しかし、Model層で「`BindableBase` を継承したゲッターセッタープロパティを保持するクラス」を他のドメインロジックと同じレベルで扱うことにかなりの違和感があるのは事実です。 ここら辺、 WPF + Prism + ReactiveProperty で開発経験のある諸先輩方はどのように考えていらっしゃるのでしょうか。 私の間違っている部分をご指摘いただけると幸いです。 感覚的な質問になってしまいますが、ご教授いただければ助かります。 宜しくお願い致します。
回答: もちょっとググってみると、私と同じ疑問を持っている人がmsdnのフォーラムでスレッドを立てていました。 WPF MVVMにおけるModelのViewModel, Viewへの対応について > > Model にINotifyPropertyChanged を実装」すること > > > これが私が違和感を抱いていた部分なのですが、リンク先では色々な考え方が提示されており、参考になりました。 個人的には「Modelはビジネスロジックのみに集中しViewを意識しない」ということが最重要であり、そのために Model 層では `INotifyPropertyChanged` (つまり `BindableBase`)を実装すべきではないのかなと思いました。(その実現方法として、Model層をUI層向けとビジネスロジック向けに分離する方法もありだなと思いました) しかし、利便性を重視して、Model 層では `INotifyPropertyChanged` を実装する方針もありだと思います。 勝手につらつら書きましたが、既に同様の議論が行われており、そこでは方針によりけりだという結論が出ていますので、それを参考にすることで本質問は終了させていただきます。 ありがとうございました。