ASP.NET MVC プロジェクトでは、AutoMapper を使用してドメイン モデルからビューモデルにマップし、その際に階層をフラット化することもあります。これは魔法のように機能し、ビューのレンダリング ロジックを非常に無駄のないシンプルなものにします。
特にオブジェクトを更新するときに、ビューモデル(またはポストモデルまたは編集モデル)からドメインモデルに逆に行きたいときに混乱が始まります。次の理由により、自動/双方向マッピングを使用できません。
- フラット化された階層をアンフラット化する必要があります
- ドメイン モデルのすべてのプロパティは変更可能である必要があり、パブリック セッターが必要です。
- ビューからの変更は、常にフラットなプロパティがドメインにマップされるだけではなく、"
ChangeManagerForEmployee()
" などのメソッドを呼び出す必要がある場合もあります。
これは、Jimmy Bogards の記事: The case for two-way mapping in AutoMapper でも説明されていますが、これに対する解決策については詳しく説明されていません。
EditModel から CommandMessages へ - 緩く型付けされた EditModel から厳密に型付けされた分割されたメッセージへ。1 つの EditModel で半ダースのメッセージが生成される場合があります。
同様のSO の質問には、Mark Seemanによる回答があります。
抽象マッパーとサービスを使用して、PostModel をドメイン オブジェクトにマップします
ただし、詳細 (概念的および技術的な実装) は省略されています。
現在の私たちの考えは次のとおりです。
- コントローラーのアクション メソッドで FormCollection を受け取る
- 元のドメイン モデルを取得し、viewModelOriginal と viewModelUpdated にフラット化します
- を使用して FormCollection を viewModelUpdated にマージする
UpdateModel()
- 一般的なヘルパー メソッドを使用して、viewModelOriginal と viewModelUpdated を比較します。
- A) Jimmy Bogard 風に CommandMessages を生成するか、B) プロパティとメソッドを介して違いをドメイン モデルに直接変更します (おそらく AutoMapper を介して 1-1 プロパティを直接マッピングします)。
FormCollection から editmodel/postmodel を介してドメイン モデルに至るまでの例を誰かが提供できますか? 「CommandMessages」または「抽象マッパーとサービス」?