現時点では、私はかなりひどいビューモデルを手に入れました。
クラスは次のようになります=>
public class AccountActionsForm
{
public Reader Reader { get; set; }
//something...
}
問題は、Reader タイプがドメイン モデルに由来することです (SRP 違反)。
基本的に、私はデザインのヒントを探しています (つまり、ビューモデルを入力/出力に分割するのは良い考えですか?) ビューモデルを摩擦のない開発者に優しいものにする方法 (つまり、マッピングはコントローラーの基本クラスを使用して自動的に機能するはずです) ?
私は AutoMapper フレームワークを認識しており、おそらくそれを使用するつもりです。
もう一度言いますが、適切なビュー モデルを作成する際によくある落とし穴は何ですか? それをどのように構造化するのですか?複数のドメイン オブジェクトの入力が必要な場合、マッピングはどのように行われますか?
ビューが複数の集約ルートからのデータを必要とする場合について混乱しています。Library、Reader、BibliographicRecord などのエンティティを持つアプリを作成しています。
私の場合-ドメインレベルでは、これら3つのタイプすべてをグループ化することは意味がありませんLibraryReaderThatHasOrderedSomeBooks
が、特定の図書館の特定の読者向けに注文された書籍に関するリストを表示するビューには、それらすべてが必要です。
そのため、その下にあるビューモデルを使用してビューを作成しOrderedBooksList
、ビューモデルを作成しても問題ないようです。またはさらに良い-フラット化手法を活用し、などの小道具を持つビューモデル。OrderedBooksListModel
LibraryOutput
ReaderOutput
BibliographicRecordOutput
OrderedBooksListModel
ReaderFirstName
LibraryName
しかし、複数の入力があるため、マッピングの問題が発生します。
1 つの集約ルートのみを開始するのは、もはや 1:1 の関係ではありません。
それは、私のドメイン モデルがちょっと間違っているということですか?
また、純粋に UI レイヤーにあるビュー モデル フィールド (つまり、チェックされたタブを示す列挙型) についてはどうでしょうか。
このような場合、これは誰もがすることですか?
FooBarViewData fbvd = new FooBarViewData();
fbvd.Foo = new Foo(){ A = "aaa"};
fbvd.Bar = new Bar(){ B = "bbb"};
return View(fbvd);
やりたくない=>
var fbvd = new FooBarViewData();
fbvd.FooOutput = _mapper.Map<Foo,FooOutput>(new Foo(){ A = "aaa"});
fbvd.BarOutput = _mapper.Map<Bar,BarOutput>(new Bar(){ B = "bbb"});
return View(fbvd);
書き込みが多いようです。:)
現時点でこれを読んでいます。そしてこれ。
Ok。私はこの問題についてよく考えました。そうです-別の抽象化レイヤーを追加することは解決策のようです=>
だから - 私の考えでは、これはすでに機能しています。
ジミー