我想使用視圖模型顯示insted域模型。我想定製一個屬性來顯示,我應該怎麼做?是否使用AutoMapper進行顯示是一個好習慣?通過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
對於通過視圖模型複雜定製顯示,我不想使用automapper映射顯示邏輯,假設automapper可以映射它。因爲它混合了不同的目的。例如:
Mapper.CreateMap<Book, BookView>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " this is for display purpose"));
但是,使用下面的手動映射似乎很直觀。從Jimmy Bogard
public BookView(Book book){
//mapping here
}
更新3
報價:
我認爲使用AutoMapper因爲你不希望使用「=」 運營商是有點懶。相反,我們用它來扁平化和重塑, 優化目標類型的環境。請記住,我 原動機AutoMapper是:
啓用保護從映射其他層領域層到 DTO的
感謝@AndrewWhitaker的鏈接
每次更新2,它是如何混合不同的目的? ViewModel的目的不是顯示域模型嗎? Automapper只是完成這一任務的工具。 – 2013-05-13 20:32:56
它與其他映射比較,例如domain到dto,這不是顯示,更可能是乾淨的。 – Pingpong 2013-05-13 20:39:29
您可以爲域' - >'DTO創建一個完全不同的映射。此外,你不應該使用AutoMapper從任何東西映射到域。 – 2013-05-13 20:40:52