3

私が理解しているように、ドメインモデルはデータ(集合体ルート)のみを記述するクラスです。それらはPOCOであり、外部のライブラリを参照しません(特別なことは何もありません)。

一方、ビューモデルは、ドメインモデルオブジェクトと、のようなすべてのインターフェイス固有のオブジェクトを含むクラスですSelectList。ViewModelにはが含まれusing System.Web.Mvc;ます。

リポジトリはデータベースからデータを引き出し、ドメインモデルオブジェクトを介してデータを提供します。 どのメカニックまたはデバイスがビューモデルオブジェクトを作成し、データベースからそれらを作成しますか? データベースにアクセスできる工場でしょうか?System.Web.Mvcなどのビュー固有のクラスをリポジトリにブリードしますか?他に何かありますか?

たとえば、都市のドロップダウンリストがある場合は、ビューモデルオブジェクトのルートで、DomainModel参照のすぐ隣にあるSelectListオブジェクトを参照します。

public class CustomerForm {
    public CustomerAddress address {get;set;}
    public SelectList cities {get;set;}
}

都市はデータベースから取得され、選択リストオブジェクトの形式である必要があります。個別の都市だけを抽出するための特別なRepositoryメソッドを作成せずに、適切なデータ型を使用できるように、冗長な2番目のSelectListオブジェクトのみを作成することをお勧めします。

4

3 に答える 3

4

CQRS(Command Query Responsibility Segregation)を確認することをお勧めします。このパターンに基づいて、リポジトリからモデルを取得してからViewModelにマップする必要はありません。

データの取得(クエリ)とビューへの表示に専用のクラスセットを割り当てることができます。これらのクラスは、プロバイダーまたは好きなように呼び出すことができます。これらのクラスは、ViewModelまたは汎用のDataSet/DataTableオブジェクトを返すことができます。このアプローチには2つの利点があります。

1- ModelとViewModelの間のマッピングについて心配する必要がないため、コーディングとメンテナンスが簡単になります。2-多くの場合、モデルにあるプロパティは、ユーザーが画面に表示することを期待しているものとは異なります。一部の開発者は、表示のみを目的としてモデルに新しいプロパティを追加します。これにより、モデルは長期的にその現実を失います。モデルに依存せずにプロバイダーから直接ViewModelまたはDataSet/DataTableを返すことで、モデルとViewModelを別々に進化させることができます。

モッシュ

于 2010-04-14T04:38:24.390 に答える
3

ドメインオブジェクトからビューモデルにデータを取り込むことは、コントローラーの責任であると言えます。コントローラの「取得」アクションは、リポジトリからドメインオブジェクトを取得し、ビューモデルを作成し、ビューモデルにデータを入力して、それをビューに渡します。

于 2010-04-08T06:14:37.910 に答える
2

AutoMapperを使用して、モデルをビューモデルに変換できます。これは、ASP.NETMVCアプリケーションでどのように使用できるかについての非常に優れた記事です。

基本的に、コントローラーのアクションは次のようになります。

[AutoMap(typeof(ProductModel), typeof(ProductViewModel))]
public ActionResult Index(int id)
{
    return View(_repository.GetById(id));
}

したがって、引き続きコントローラーでドメインモデルを操作し、AutoMapアクションフィルターを使用AutoMapperして、マッピングファイルに従ってモデルをビューモデルに変換し、ビューに渡します。

于 2010-04-08T07:05:29.920 に答える