Отдельная модель и модель представления пользовательского интерфейса в Spring (вроде MVVM в Spring) - PullRequest
4 голосов
/ 26 декабря 2010

Я бы хотел начать обсуждение разделения чистой модели и модели пользовательского интерфейса в Spring 3.

Под чистой моделью я имею в виду основной объект / объекты, которые я извлекаю из базы данных, скажем, некоторую «учетную запись пользователя».Он содержит достаточно информации, чтобы отобразить ее в виде HTML или передать в веб-службу.

Под моделью пользовательского интерфейса я подразумеваю все вспомогательные материалы, которые необходимы в пользовательском интерфейсе для работы с этим объектом.Например, если «учетная запись пользователя» имеет «состояние», то мне нужно извлечь все «состояния» из базы данных, скажем, для поля со списком.Мнения сложны, и в некоторых случаях они требуют больше информации, в других - меньше.Также было бы неплохо иметь возможность изменять некоторые списки, добавляя такие элементы, как «Выбрать все», что является чисто пользовательским интерфейсом (и не совсем удобно сделать из шаблона представления).

Я слышал, что есть так называемые Model-Шаблон View-ViewModel, который, кажется, решает эти проблемы, но я никогда не пробовал его реализации.

Решение, которое я сейчас использую, состоит в том, чтобы разбить логику на две службы - одну для чистой модели и одну для модели пользовательского интерфейса.Это выглядит так:

@RequestMapping(value="app/user_accounts/{id}")
public String getUserAccount(@PathVariable("id") String id) {
    service.getUserAccount(id); // Gets main object and puts it into model
    presenter.formUserAccount(); // Gets all classifier for main object's properties
    return "user_account";
}

Что мне не нравится в этом, так это то, что представление и его так называемая модель представления не привязаны друг к другу.Я могу вызвать Presenter.formUserAccount () и вернуть полностью несвязанное имя представления.

Другой подход, который я вижу, похож на аннотацию контроллера Spring.У нас есть классы, аннотированные как @ViewModels, и методы, которые отображаются для просмотра имен.Перехватчик находит и выполняет эти методы перед отображением определенного представления.Это кажется достаточно элегантным, но требует много написания кода.

Как бы вы решили эту проблему?

1 Ответ

1 голос
/ 21 января 2011

Я думал об этом в контексте Grails, который основан на Spring MVC.Мой подход заключается в использовании командных объектов в качестве моделей представления, поскольку они предоставляют функции привязки и проверки данных, которые вы хотели бы видеть в модели представления.С помощью командных объектов вы можете абстрагировать «чистую модель» (или модель домена) от своего представления, используя командные объекты для сопоставления свойств представления с вашими объектами домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...