我想使用视图模型来显示域模型。我想自定义一个显示属性,我应该怎么做?使用 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"));
但是,使用如下所示的手动映射似乎很直观。
public BookView(Book book){
//mapping here
}
更新 3
引用Jimmy Bogard的话:
我认为使用 AutoMapper 因为您不想使用“=”运算符有点懒惰。相反,我们使用它来展平和重塑,优化目标类型的环境。请记住,我最初使用 AutoMapper 的动机是:
通过映射到 DTO 来保护域层免受其他层的影响
感谢@AndrewWhitaker 的链接