Я голосую и широко использую ваш вариант № 1. Несколько причин почему:
- Позволяет модели со сложным представлением, такие как объединение нескольких списков объектов моего домена. Представьте себе PostViewModel с элементом Post и контейнером IList, свисающим с него.
- В моем текущем проекте мы абстрагировали валидацию домена туда, где он всплывает в наших пользовательских моделях ViewModel, и делаем небольшую Ajax-валидацию на формах.
- Хотя концепция напрямую не отображает ваши доменные объекты в Модели, у меня нет проблем с подвешиванием Post свойства моего PostViewModel.
Последний пункт - почему концепция ViewModels действительно существует. Это не нарушение DDD, когда вы открываете свой объект Domain вплоть до вашего пользовательского интерфейса или даже представления - это разработано и ожидается от концепций DDD и UI. Вы открываете для использования только объекты из своего домена и блокируете / сохраняете их состояния с помощью служб и инфраструктуры. Таким образом, вы не нарушаете фактический объект Domain в вашем пользовательском интерфейсе.
Это когда вы включаете концепции MVC для вашего пользовательского интерфейса и пытаетесь отобразить это конкретное представление страницы / местоположения. У вас могут быть (и будут) дополнительные элементы отображения, которые могут быть вообще не связаны с Доменом, например Индикатор выполнения , предназначенный только для пользовательского интерфейса. Индикатор выполнения относится только к пользовательскому интерфейсу и уровню приложений. Это не имеет никакого отношения к вашему домену.
Итак, решение DDD, которое я принимаю, заключается в использовании объекта hybird в слоях Application / UI, который может содержать несколько объектов: как объекты Domain, так и объекты Application для визуализации для этого конкретного представления. Это концепция ViewModel, по своей основной причине.
Концепцию ViewModel можно рассматривать как некоммерческие объекты прикладного уровня в терминах DDD.
Если немного отойти от темы и поговорить об одной конкретной технологии, ASP.NET MVC имеет дополнительные функции, помогающие хорошо совместить эту концепцию. Он не встроен непосредственно в ASP.NET MVC, но доступен как дополнительная сборка от Microsoft под названием проект Futures.
Посмотрите в моем блоге о паре функций , наиболее полезной функцией является метод расширения RenderAction:
http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx
Это чрезвычайно мощная концепция, которая раскручивает базовый контроллер и вызывает метод действия. Это значительно упростило наши ViewModels, чтобы заботиться только о представлении, которое они отображают. Мне больше не нужно прикреплять такие элементы, как элементы управления боковой панели или другие общие поля данных, панели навигации и т. Д., Которые не имеют никакого отношения к представлению.
RenderAction отличается от RenderPartial по чисто DDD-причинам: он позволяет переместить бизнес-логику обратно в контроллер, которому он принадлежит. И контроллер вызывает правильное представление для отображения. Это строго следует понятиям DDD и MVC.
Microsoft заявила, что RenderAction станет частью ASP.NET MVC 2.0, когда она выйдет в следующем году.
Извините за напыщенную речь ...