Я хочу использовать модель представления для отображения insted модели домена. И я хочу настроить свойство для отображения, как мне это сделать? И хорошо ли использовать 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
Цитата из Джимми Богард:
Я думаю, используя AutoMapper, потому что вы не хотите использовать "=", оператор немного ленив. Вместо этого мы используем его для сглаживания и изменения, оптимизация для среды типов назначения. Помните, мой оригинальной мотивацией для AutoMapper было:
Включить защиту уровня домена от других уровней путем сопоставления с DTOS
Спасибо @AndrewWhitaker за ссылку