Доступ к объектам домена в представлении - PullRequest
3 голосов
/ 12 ноября 2009

Если я не хочу раскрывать внутреннее состояние моих доменных объектов, но мне нужно отобразить их, я могу подумать о трех подходах. Какой из них является наиболее «правильным» (если есть?).

  1. «Подход DTO / ViewModel». Это похоже на популярный подход в мире ASP.NET MVC (особенно с использованием AutoMapper).
  2. The "подход декоратора". Если у меня есть «Клиент» сущность, я ее украшаю с "DisplayableCustomer", который может получить доступ к внутреннему состоянию клиент (на большинстве языков, которые Я имел дело с).
  3. Интерфейс подход ". Где я делаю что-то вроде это:

    class Customer {
        ....
        public void renderWith(CustomerRenderer renderer) {
             renderer.renderCustomer(address,name);
        } 
    }
    
    interface CustomerRenderer {
        public void renderCustomer(Address address, Name name);
    }
    

1 Ответ

3 голосов
/ 12 ноября 2009

Я голосую и широко использую ваш вариант № 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, когда она выйдет в следующем году.

Извините за напыщенную речь ...

...