1

私はMVVMを使用してアプリケーションを構築することを学んでおり、次のような状況にあります:

  • ViewModel は、 type のオブジェクトのリストを表示する必要がありますExamination。このリストはビュー内の にデータバインドされ、ListViewそこからフィルタリングされ、ユーザーはActiveExaminationさらに使用するために を選択します。
  • モデルレイヤーに「存在する」リポジトリは、「ドメインオブジェクトのメモリ内コレクションとして動作」する必要があり、ViewModel 内でインスタンス化されます。

ここで私の質問は次のとおりです。リポジトリはビューにデータバインドされるコレクションである必要がありますか、それともINPCを実装するプロパティへの「データソース」のみである必要がありますか? 例えば、次の可能性から、どちらかが正しくてどちらかが間違っているのか、それとも両方とも間違っているのか...?

// example where the list is replaced in order to be changed;

// ViewModel class (part of it)
public class ThisViewModel : ViewModelBase {
    public List<Examination> ExaminationList {
        get { return _examinationList; }
        set { _examinationList = value;
              NotifyOfPropertyChange("ExaminationList"); }
    }
}


var repo = new ExaminationRepository();
ThisViewModel.ExaminationList = repo.getAll().where(ex => ex.Value > 20).ToList();

2 番目のオプション

// Example where the very property IS a repository

// ViewModel class (part of it)
public class ThisViewModel : ViewModelBase {

    // the List is actually a repository in disguise.
    IEnumerable _examinationList = new ExaminationRepository();

    public List<Examination> ExaminationList {
        get { return _examinationList; }
        set { _examinationList = value;
              // This should be "NotifyOfCollectionChange", I guess...
              NotifyOfPropertyChange("ExaminationList"); }
    }
}

ほとんどの場合、私はここでかなり混乱/間違いを犯していますが、私のアプリケーションはかなり小さくて単純なアーキテクチャであり、この種の問題 (ORM、IoC、 DI)、代わりに、「WPF / MVVMデータバインディング環境で変更可能なリポジトリベースのコレクションを適切に処理する方法」に主に関心があります。

編集: 私のアプリケーションに関するいくつかのコンテキスト: アプリケーションは、臨床検査を実行するアプリケーションです。患者のリストがあり、各患者には検査があります。患者リポジトリと検査リポジトリがあります。PatientList で患者を選択すると、その患者の ExaminationsList に、Examinations リポジトリから一致する Examinations が表示されます。患者と検査に対するユーザー アクションは、CRUD、または最も具体的には BREAD (参照、読み取り、編集、追加、および削除) です。

アドバイスをありがとう!

4

1 に答える 1

2

私の意見では、大規模なアプリケーションで最善の分離を行うには、常に個別のコレクションを使用してデータベースから入力し、UI に表示する必要があります。これ、コレクションを 2 回反復処理する必要があることを意味しますが、 (ビュー モデル オブジェクトを埋める場合IsSelected)などの UI の追加の表示プロパティを追加したいため、WPF では多くの場合、これが必要になります。IsFocused

ただし、これの主な理由は、アプリケーション内のさまざまなレイヤーをインターフェイスできるようにして、各レイヤーを個別にテストできるようにすることです。これを行う必要がない場合は、それほど重要ではないかもしれません。

UIでこれらのクラスを使用すると、開発者に常に従うように指示しているレイヤー間の分離を直接壊すときに、Microsoftが自動生成されたクラス(たとえばLinq2SQLから)にINotifyPropertyChangedandインターフェイスを実装する理由を常に疑問に思っていました。INotifyPropertyChanging

更新 >>>

小さなアプリケーションの場合、これらのことをどこでどのように行うかは問題ではないと思います。非常に小さなアプリケーションを作成するときは、MVVM をわざわざ使用することさえありません。レイヤーを作成したり、MVVM フォルダー構造を実装したりすると、開発時間とコードが追加されます。

a) アプリケーションの個々のレイヤーを個別にテストする、または

b) 将来のある段階で、1 つまたは複数のレイヤーを「交換」する必要が生じる可能性があります。たとえば、SQLデータベースからデータベースに移動したり、WPF UI から Web ベースの UI に移動したりします。Oracle

于 2013-10-07T14:26:43.330 に答える