2013-05-13 7 views
14

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

+2

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. –

+0

Porównuje się do innych mapowań, na przykład domena do dto, która nie jest wyświetlana i bardziej prawdopodobnie czysta. – Pingpong

+0

Utworzenie zupełnie innego odwzorowania dla domeny '->' DTO. Ponadto, nie powinieneś używać AutoMappera do mapowania z dowolnej domeny DO. –

Odpowiedz

18

Jest to dobre dla przypadków użycia AutoMapper (użyłem go w ten sposób w wielu projektach z powodzeniem). Ogólnie rzecz biorąc, nie chcesz , a nie chcieć wystawiać elementy domeny na widok (w MVC, to wystawiałoby twój model bezpośrednio na twój widok, który jest niepoprawny).

Nie potrzebujesz odwzorowania 1-1 między jednostką domeny a viewmodel. Możesz sprawić, by wyglądały zupełnie inaczej i dostosować odwzorowanie w rozmowie CreateMap<>. Aby użyć przykładu:

Mapper.CreateMap<Book, BookView>() 
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " Decorated")); 

Najgorszy przypadek, można rów automapper złożonych przypadków lub użyć niestandardowego typu resolverowi z automapper aby otrzymać pracę.

Faktycznie, this is how Jimmy Bogard (the author) recommends using AutoMapper. W szczególności wspomina o mapowaniu z jednostek domeny na ASP.NET MVC ViewModels do użytku z mocno wpisanymi widokami.

Kolejną zaletą jest to, że możesz testować swoje profile mapowania. W ten sposób, jeśli pojawi się niedopasowanie między ViewModel i modelem, otrzymasz test jednostki, który uległ awarii.

Aktualizacje:

Myślę, że cytat został dodany do Twojego pytania kolejnych podporach korzystających AutoMapper do mapowania z model domeny do ViewModels:

Zamiast tego używamy go spłaszczyć i zmiany kształtu, optymalizacja dla środowiska typu docelowego.

Więc w moim przykładzie ty Zdecydowanie być optymalizacja dla otoczenia TYP docelowego (w tym przypadku rzutem).

również za link odwołać powyżej was powinien nie używać automapper mapować do domenę, tylko z. Mając to na uwadze, musisz napisać jakąś logikę, aby tworzyć/aktualizować encje domeny z tego, co otrzymujesz z widoku bez względu na wszystko. Pamiętaj, że działania kontrolera nie powinny bezpośrednio przyjmować jednostek domeny (nie powinieneś ufać danym pochodzącym bezpośrednio z widoku - niech model określi, czy jednostka domeny byłaby ważna, czy nie).

+1

Na podstawie aktualizacji (pomocne), czy istnieje przykład lub łącza do konwersji modelu widoku na model domeny z weryfikacją modelu widoku? – Pingpong

+0

Nie rozumiem tego jako ostatniego akapitu. Czy masz na myśli, że nie powinniśmy mapować używając automapper z ViewModel do domeny (POCO)? Jeśli tak, jak zapisać dane wprowadzane przez użytkownika (Wyświetl) do bazy danych (Model)? wykonując ręczne mapowanie? – Willy

+0

@Willy: Tak, wykonując ręczne mapowanie. Chodzi o to, że domena jest zbyt ważna, aby możliwe było automatyczne mapowanie. –

Powiązane problemy