Из книги ASP.NET MVC2 In Action:
Некоторые экраны более сложны, чем одна таблица.Они могут содержать несколько таблиц и дополнительные поля других данных: изображения, заголовки, промежуточные итоги, графики, диаграммы и миллионы других вещей, которые усложняют представление.Решение для презентации модели масштабируется, чтобы справиться со всеми.Разработчики могут уверенно поддерживать даже самые мрачные экраны, если модель презентации разработана хорошо.Если экран содержит несколько сложных элементов, модель представления может быть оболочкой, объединяя их все и освобождая файл разметки от большой сложности.Хорошая модель представления не скрывает эту сложность - она представляет ее точно и максимально просто, и она отделяет данные на экране от дисплея.
Создайте модель представления, которая представляет ваш экран.Затем создайте его и передайте в View. Эта книга великолепна и рассказывает об использовании модели презентации.С AutoMapper подумайте о том, как вы могли бы выполнить свое отображение без него, а затем используйте его.AutoMapper не собирается делать что-либо волшебное, он устраняет шлепки клавиатуры.
AutoMapper, оставьте ваш список требований:
- Список сообщений [int Id, string Body, intLikes, строка p.User.FirstName, строка p.User.LastName]
- Список тегов [int Id, имя строки]
- Список всех авторов, существующих в моей базе данных [string UrlFriendlyName]
и при условии, что у вас есть следующие модели: Post, Tag, Author
Лично мне не нравится передавать объекты Model в мою презентацию в MVC или MVVM, но это я.Скажем, мы следуем этому здесь и создаем PostDisplay, TagDisplay и AuthorDisplay.
На основании требований View, ViewModel будет выглядеть следующим образом:
Public class IndexVM
{
Public List<PostDisplay> Posts {get; set;}
Public List<TagDisplay> Tags {get; set;}
Public List<AuthorDisplay> Authors {get; set;}
}
В этом случае способ составления Viewпотребует от вас его построения:
public ActionResult Index()
{
var posts = postsRepository.Posts.ToList();
var tags = postsRepository.Tags.ToList();
var authors = postsRepository.Authors.ToList();
Mapper.CreateMap<Post, PostDisplay>();
Mapper.CreateMap<Tag, TagDisplay>();
Mapper.CreateMap<Author, AuthorDisplay>();
private var IndexVM = new IndexVM
{
Posts = Mapper.Map<List<Post>, List<PostDisplay>>(posts),
Tags = Mapper.Map<List<Tag>, List<TagDisplay>>(tags),
Authors = Mapper.Map<List<Author>, List<AuthorDisplay>>(authors)
};
return View(IndexVM);
}
Итак, в итоге вы получите ViewModel для передачи вашему представлению, которое точно соответствует тому, что вы хотите отобразить, и не тесно связано с вашей моделью домена.,Я не могу придумать, как AutoMapper отобразит три отдельных списка результатов в один объект.
Чтобы уточнить, AutoMapper отобразит дочерние коллекции так, что структура, такая как:
public class OrderItemDto{}
public class OrderDto
{
public List<OrderItemDto> OrderItems { get; set; }
}
, будет отображатьсяto:
public class OrderItem{}
public class Order
{
public List<OrderItem> OrderItems { get; set; }
}
Пока вы говорите, как сопоставлять типы: OrderDto -> Order и OrderItemDto -> OrderItem.