Я не уверен, что есть хоть один хороший ответ.Звучит так, как будто вы спорите о том, как поддерживать согласованность - есть ли у вас простая схема передачи с уровня представления или вы вставляете запросы пользователей и имеете там логику.
Если это, собственно, и есть вопрос, то в игру вступают различные факторы.Предпочитаете ли вы сделать проверку на уровне презентации?Насколько сложным является приложение и насколько оно должно быть масштабируемым?Нужно ли обращаться к моделям ваших представлений в нескольких местах?
Итак, учитывая все это, я могу рассказать вам, как лично я предпочитаю подходить к этой проблеме (в частности, к проблеме добавления, которую вы упоминаете).Мне обычно нравится создавать модели представления, которые описывают проблемы пользователей с помощью обобщений, таких как EditItemViewModel<T>
или ListViewModel<T>
.Таким образом, в графическом интерфейсе будет какой-то список комнат, привязанных к ListViewModel<Room>
.Эта виртуальная машина, очевидно, будет предоставлять видимую коллекцию, а также команды для добавления, удаления, редактирования.
Итак, с моей точки зрения, уровень представления, моделирующее представление, которое собирается делать эта виртуальная машина, - это маршрутизация запросов для других проблем с графическим интерфейсом.Если вы нажмете «Добавить», чтобы добавить комнату, эта виртуальная машина будет отвечать за инициирование запроса с помощью команды для любого экрана / окна / всего, что необходимо для добавления комнаты, которая будет иметь свою собственную виртуальную машину.Эта виртуальная машина, получив запрос на добавление, передаст сгенерированный объект передачи данных в домен, где произойдет валидация, и все необходимые операции домена.Я обычно справляюсь с этим через сервисный слой.Теперь, если операция с доменом прошла успешно, сервисный уровень вызовет какой-то четный или обратный вызов, чтобы сообщить виртуальной машине списка, что произошли изменения.Когда это происходит, виртуальная машина списка повторно запрашивает свой сервис и соответственно обновляет свою наблюдаемую коллекцию.Теперь ваш графический интерфейс совместим с доменом по всем направлениям.
Причина, по которой я предпочитаю этот тип многоуровневого подхода, заключается в том, что вся бизнес-логика находится в месте «ниже» графического интерфейса, и графический интерфейс не нужнообеспокоиться этим случаем.Концептуально, GUI просто говорит: «Здесь, на уровне домена, пользователь хочет добавить это - сделайте все это, и сообщите всем заинтересованным компонентам GUI, когда вы закончите, чтобы они могли обновить себя».
То, что я здесь описываю, естественным образом повлечет за собой некоторые накладные расходы по сравнению с простой сквозной схемой или схемой, в которой виртуальные машины просто повторно выставляют свойства некоторого объекта модели.Но лично я думаю, что преимущество, полученное с точки зрения разделения, того стоит, особенно когда вы расширяете приложение.Это дает вам возможность фундаментально изменять внутренние взаимодействия модели предметной области без изменения кода уровня представления.