Шаблон DTO + ленивая загрузка + Entity Framework + ASP.Net MVC + Auto Mapper
во-первых, извините за длинный вопрос, но я должен дать некоторую базовую информацию.
мы создаем приложение, которое использует ASP.net Шаблоны MVC, JQuery, Entity Framework, WCF и мы использовали POCO в качестве нашего доменного слоя. В нашем приложении есть уровень служб WCF для обмена данными с ASP.net приложение MVC и использует объекты передачи данных (DTOs) из WCF в MVC.
кроме того, приложение использует ленивую загрузку в Entity Framework с помощью AutoMapper при преобразовании домена в DTOs в нашем слое сервиса WCF.
наша архитектура бэкэнда выглядит следующим образом (службы WCF - > менеджеры - > репозиторий - > Entity Framework (POCO))
в нашем приложении мы не используем модели представления, поскольку мы не хотим другого слоя отображения для приложения MVC, и мы используем только DTOs в качестве моделей представления.
вообще, мы имеем нормальные и облегченные Дтос для домена как клиент, Кустомерлите, ЕТК (Lite объект имея несколько свойств, чем обычно).
теперь у нас возникли некоторые трудности с DTOs, потому что наша структура DTO становится более сложной, и когда мы думаем о ремонтопригодности (с общей иерархической структурой DTOs), мы теряем производительность.
например,
у нас есть страница просмотра клиентов и наша иерархия DTO следующим образом
public class CustomerViewDetailsDTO
{
public CustomerLiteDto Customer{get;set;}
public OrderLiteDto Order{get;set;}
public AddressLiteDto Address{get;set;}
}
в этом случае мы не хотим, чтобы некоторые поля OrderLiteDto для этого представления. Но какой-то другой взгляд нуждается в этом поля, поэтому для того, чтобы облегчить это, мы используем эту структуру.
когда дело доходит до автоматического сопоставления, мы сопоставляем CustomerViewDetailsDTO, и мы получим дополнительные данные (которые не требуются для конкретного представления) от ленивой загрузки (Entity Framework).
Мои Вопросы:
есть ли механизм, который мы можем использовать для повышения производительности при рассмотрении ремонтопригодность?
это возможно ли использовать Automapper с более функциями отображения на основе карт для того же DTO ?
1 ответов
во-первых, не используйте ленивую загрузку, поскольку, вероятно, это приведет к выбору N+1 проблем или подобных.
Select N + 1-это анти-шаблон доступа к данным, в котором находится база данных доступ осуществляется неоптимальным способом.
другими словами, использование ленивой загрузки без нетерпеливой загрузки коллекций приводит к тому, что Entity Framework переходит в базу данных и возвращает результаты по одной строке за раз.
используйте JsRender для шаблонов, так как это намного быстрее, чем JQuery Шаблоны: Render Bemchmark и вот хорошая информация о том, как использовать это: сокращение кода JavaScript с помощью шаблонов jsRender в приложениях HTML5
вообще, мы имеем нормальное и облегченное Дтос для домена как клиент, CustomerLite и т. д. (объект Lite имеет несколько свойств, чем обычно).
ваш обычный DTO, вероятно, является ViewModel, поскольку ViewModels могут или не могут сопоставлять один к одному с DTOs, а ViewModels часто содержат логика отодвинута от представления или помогает вернуть данные в модель в ответ пользователя. DTOs не имеют никакого поведения, и их цель-уменьшить количество вызовов между уровнями приложения.
есть ли механизм, который мы можем использовать для повышения производительности при рассмотрении ремонтопригодность?
используйте один ViewModel для одного представления, и вам не придется беспокоиться о ремонтопригодности. Лично я обычно создайте класс abtract, который является базовым, и для редактирования, создания или списка я наследую этот класс и добавляю свойства, определенные для представления. Поэтому для примера Create view не нужен PropertyId (поскольку кто-то может захватить ваш пост и опубликовать его), поэтому только Edit и List ViewModels имеют свойство PropertyId.
можно ли использовать Automapper с дополнительными функциями отображения на основе карт для того же DTO ?
вы можете использовать AutoMapper, чтобы определите каждую карту, но вопрос в том, насколько сложной будет карта. Использование одного ViewModel для просмотра, и ваши карты будут просты в написании и обслуживании. Я должен отметить, что не рекомендуется использовать Automapper в Коде доступа к данным, как:
одним из недостатков AutoMapper является проекция из объектов домена по-прежнему заставляет весь объект домена запрашиваться и загружаться.
источник: Autoprojecting по LINQ запросы
вы можете использовать набор расширений, которые ограничены в настоящее время, чтобы ускорить отображение в Коде доступа к данным: прекратите использовать AutoMapper в Коде доступа к данным
в отношении