Отображение модели домена для просмотра модели с помощью AutoMapper или нет - программирование
Подтвердить что ты не робот

Отображение модели домена для просмотра модели с помощью AutoMapper или нет

Я хочу использовать модель представления для отображения 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 за ссылку

4b9b3361

Ответ 1

Это хороший прецедент для AutoMapper (я использовал его таким образом для многих проектов с успехом). Как правило, вы не хотите выставлять объекты домена на свое представление (в MVC это будет подвергать вашу модель напрямую вашему представлению, что неверно).

Вам не нужно сопоставление 1-1 между объектом домена и моделью просмотра. Вы можете сделать их совершенно разными и настроить отображение в своем вызове CreateMap<>. Чтобы использовать ваш пример:

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

В худшем случае вы можете отключить automapper для сложных случаев или использовать распознаватель настраиваемого типа с automapper, чтобы выполнить работу.

На самом деле, так Джимми Богард (автор) рекомендует использовать AutoMapper. Он специально упоминает сопоставление объектов домена с ASP.NET MVC ViewModels для использования с строго типизированными представлениями.

Другим преимуществом является то, что вы можете unit test ваши профили сопоставления. Таким образом, если вы столкнетесь с несоответствием между ViewModel и Model, вы получите отказ unit test.

Обновление:

Я думаю, что цитата, добавленная вами к вашему вопросу, также поддерживает использование AutoMapper для сопоставления из моделей домена в ViewModels:

Вместо этого мы используем его для выравнивания и изменения, оптимизируя для среды типов назначения.

Итак, в моем примере вы определенно будете оптимизировать для среды типа назначения (в этом случае представление).

Также по ссылке, на которую ссылаюсь выше, вы не должны использовать automapper для отображения в домене, только из. Имея это в виду, вам придется написать некоторую логику для создания/обновления доменных объектов из того, что вы получаете от представления, независимо от того, что. Помните, что действия контроллера не должны принимать объекты домена напрямую (вы не должны доверять данным, которые поступают непосредственно из представления - пусть модель определяет, будет ли объект домена действительным или нет).