ASP.NET MVC: какая механика возвращает объекты ViewModel? - PullRequest
3 голосов
/ 08 апреля 2010

Насколько я понимаю, доменные модели - это классы, которые описывают только данные (совокупные корни). Они являются POCO и не ссылаются на внешние библиотеки (ничего особенного).

С другой стороны, модели представлений - это классы, которые содержат объекты модели предметной области, а также все специфичные для интерфейса объекты, такие как SelectList. ViewModel включает в себя using System.Web.Mvc;.

Репозиторий извлекает данные из базы данных и передает их нам через объекты модели предметной области. Какой механик или устройство создает объекты модели представления, заполняя их из базы данных? Будет ли фабрика иметь доступ к базе данных? Вы бы добавили в репозиторий определенные классы, такие как System.Web.Mvc? Что-то еще?

Например, если у вас есть раскрывающийся список городов, вы бы ссылались на объект SelectList в корне вашего объекта View Model, прямо рядом с вашей ссылкой DomainModel:

public class CustomerForm {
    public CustomerAddress address {get;set;}
    public SelectList cities {get;set;}
}

Города должны исходить из базы данных и быть в форме объекта списка выбора. Мы надеемся, что вы не создадите специальный метод Repository для извлечения только отдельных городов, а затем создадите избыточный второй объект SelectList только для того, чтобы у вас были правильные типы данных.

Ответы [ 3 ]

4 голосов
/ 14 апреля 2010

Я бы посоветовал вам взглянуть на CQRS (Разделение ответственности по командным запросам). Основываясь на этом шаблоне, вам на самом деле не нужно получать вашу модель из репозитория, а затем сопоставлять ее с ViewModel.

Вы можете выделить отдельный набор классов для извлечения данных (запросов) и отображения в представлении. Вы можете называть эти классы провайдерами или как угодно. Эти классы могут возвращать ViewModel или общие объекты DataSet / DataTable. У этого подхода есть 2 преимущества:

1 - Вам не нужно беспокоиться о сопоставлении между Model и ViewModel, что упрощает кодирование и обслуживание. 2- Часто свойства вашей Модели не совсем те, которые пользователь ожидает увидеть на экране. Некоторые разработчики добавляют новые свойства в свою модель только для отображения, что приводит к тому, что модель теряет свою реальность в долгосрочной перспективе. Возвращая ViewModel или DataSet / DataTable напрямую от вашего провайдера, не завися от вашей модели, вы позволяете вашей модели и вашим ViewModel развиваться отдельно.

Мош

3 голосов
/ 08 апреля 2010

Я бы сказал, что заполнение модели представления из объекта домена является обязанностью Контроллера. Действие контроллера «Получить» извлекает объект домена из хранилища, создает модель представления, заполняет модель представления и затем передает его представлению.

2 голосов
/ 08 апреля 2010

AutoMapper может использоваться для преобразования ваших моделей в view-модели. Вот очень хорошая статья о том, как вы можете использовать ее в своем приложении ASP.NET MVC.

По сути, действие вашего контроллера может выглядеть так:

[AutoMap(typeof(ProductModel), typeof(ProductViewModel))]
public ActionResult Index(int id)
{
    return View(_repository.GetById(id));
}

Таким образом, вы все еще работаете с вашими моделями доменов в контроллере, и фильтр действий AutoMap будет использовать AutoMapper для преобразования модели в модель представления в соответствии с файлом сопоставления и передачи ее в представление.

...