MVVMパターンの私の理解では、唯一の実際的な要件は、ViewがViewModelのプロパティから(おそらくバインディングメカニズムを介して)すべてのデータを取得することです。ViewModelは、そのビュー用に特別に作成したクラスであり、必要に応じて自分自身にデータを入力する責任を負います。ビューのActiveRecordのように考えることができます。
そのため、ViewModel内で何をして、そのプロパティが表示する必要のあるデータを取得するかは重要ではありません。いくつかのサービスにクエリを実行するか、1つ以上のビジネスエンティティモデルを読み取るか、その場で生成するか、または上記のすべてによって取得できます。機能的なビューを作成するためにこれらすべての組み合わせが必要になるのは、まったく正常なことです。
他のプレゼンテーションパターンと同様に、重要なのは、画面にデータを表示するプロセスと、そのデータを取得するプロセスを分離することです。そうすれば、プロセスの各部分を個別にテストできます。
編集:これは、依存関係のフローの小さいがうまくいけば完全な例です。
// Model/service layer
public class MyModelA
{
public string GetSomeData()
{
return "Some Data";
}
}
public class MyModelB
{
public string GetOtherData()
{
return "Other Data";
}
}
// Presentation layer
public class MyViewModel
{
readonly MyModelA modelA;
readonly MyModelB modelB;
public MyViewModel(MyModelA modelA, MyModelB modelB)
{
this.modelA = modelA;
this.modelB = modelB;
}
public string TextBox1Value { get; set; }
public string TextBox2Value { get; set; }
public void Load()
{
// These need not necessarily be populated this way.
// You could load an entity and have your properties read data directly from it.
this.TextBox1Value = modelA.GetSomeData();
this.TextBox2Value = modelB.GetOtherData();
// raise INotifyPropertyChanged events here
}
}
public class MyView
{
readonly MyViewModel vm;
public MyView(MyViewModel vm)
{
this.vm = vm;
// bind to vm here
}
}
// Application layer
public class Program
{
public void Run()
{
var mA = new MyModelA();
var mB = new MyModelB();
var vm = new MyViewModel(mA, mB);
var view = new MyView(vm);
vm.Load();
// show view here
}
}