Chcę użyć modelu widoku dla wyświetlacza wbudowanego modelu domeny. I chcę dostosować właściwość do wyświetlania, jak mam to zrobić? A czy dobrze jest używać AutoMappera do wyświetlania?Mapowanie modelu domeny w celu wyświetlenia modelu za pomocą programu AutoMapper lub nie
Poniżej znajduje się przykładowy kod:
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; }
}
Jeśli mogę użyć w inny sposób, można dostosować każdą własność, jak poniżej:
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; }
}
Jak mam to zrobić? A czy dobrze jest używać AutoMappera do wyświetlania?
Aktualizacja
Wydaje użyciu automapper w scenariuszu poniżej jest bardziej odpowiednie. Na przykład mapowanie modelu widoku na model domeny, jak na przykład poniżej. Jakieś opinie?
[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();
}
}
Aktualizacja 2
dla złożonych niestandardowym wyświetlaczem poprzez widoku modelu, nie chcę używać automapper do wyświetlania map logiki, zakładając automapper można go na mapie. Ponieważ łączy różne cele. Na przykład:
Mapper.CreateMap<Book, BookView>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " this is for display purpose"));
Jednak korzystanie z mapowania ręcznego, jak poniżej, wydaje się intuicyjne.
public BookView(Book book){
//mapping here
}
Update 3
Cytat Jimmy Bogard:
myślę użyciu AutoMapper ponieważ nie chcesz korzystać z „=” operatora jest nieco leniwy. Zamiast tego używamy go do spłaszczenia i przekształcenia, optymalizując środowisko środowiska docelowego. Pamiętaj, mój oryginalna motywacja dla AutoMapper było:
Włącz ochronę warstwy domeny z innymi warstwami poprzez mapowanie do DTOs
Thanks @AndrewWhitaker za link
W aktualizacji 2, jak to się miesza różne cele? Czy celem ViewModel nie jest wyświetlanie modelu domeny? Automapper to po prostu narzędzie do tego. –
Porównuje się do innych mapowań, na przykład domena do dto, która nie jest wyświetlana i bardziej prawdopodobnie czysta. – Pingpong
Utworzenie zupełnie innego odwzorowania dla domeny '->' DTO. Ponadto, nie powinieneś używać AutoMappera do mapowania z dowolnej domeny DO. –