ドメインモデルの代わりにビューモデルを表示に使いたいです。また、表示用にプロパティをカスタマイズしたいのですが、どうすればよいですか? また、表示に AutoMapper を使用することは良い習慣ですか?
以下はコードサンプルです。
public class BookController : BaseController
{
private IBookService bookService;
public BookController(IBookService bookService)
{
this.bookService = bookService;
}
public ActionResult Details(int id)
{
var book = bookService.GetBookById(id);
return View(Mapper.Map<BookView>(book));
}
}
public class Book
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class BookView
{
public int Id { get; set; }
public string Name { get; set; }
}
別の方法を使用すると、以下のように任意のプロパティをカスタマイズできます。
public ActionResult Details(int id)
{
var book = bookService.GetBookById(id);
return View(new BookView(book));
}
public class BookView
{
public BookView(Book book){
Name = book.Name +" Decorated";
}
public int Id { get; set; }
public string Name { get; set; }
}
どうすればいいですか?また、表示に AutoMapper を使用することは良い習慣ですか?
アップデート
以下のシナリオでは automapper を使用する方が適切なようです。たとえば、以下のようにビュー モデルをドメイン モデルにマッピングします。ご意見はありますか?
[HttpPost]
public ActionResult Create(BookView bookView)
{
try
{
var book = Mapper.Map<Book>(bookView); //this is wrong
bookService.SaveOrUpdate(book);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
更新 2
ビューモデルを介した複雑なカスタム表示の場合、オートマッパーがマップできると仮定して、オートマッパーを使用して表示ロジックをマップしたくありません。さまざまな目的が混在しているからです。例えば:
Mapper.CreateMap<Book, BookView>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " this is for display purpose"));
ただし、以下のような手動マッピングの使用は直感的に思えます。
public BookView(Book book){
//mapping here
}
アップデート 3
ジミー・ボガードからの引用:
「=」演算子を使用したくないので AutoMapper を使用するのは少し面倒だと思います。代わりに、それを使用してフラット化および再形成し、宛先タイプの環境に合わせて最適化します。覚えておいてください、AutoMapper の最初の動機は次のとおりでした。
DTO へのマッピングにより、ドメイン層を他の層から保護できるようにする
リンクをありがとう@AndrewWhitaker