В соответствии с традиционным подходом или теорией, ViewModel должна быть частью уровня пользовательского интерфейса. По крайней мере, имя так говорит.
Но когда вы приступаете к реализации этого самостоятельно с помощью Entity Framework, MVC, Repository и т. Д., Тогда вы понимаете что-то еще.
Кто-то должен отобразить Модели сущностей с помощью ViewModels (DTO упоминается в конце). Должно ли это быть сделано в A) уровне UI (Контроллером) или в B) уровне Service?
Я использую Вариант B. Вариант A - это нет-нет, потому что тот простой факт, что несколько моделей сущностей объединяются в одну ViewModel. Мы не можем передавать ненужные данные на уровень пользовательского интерфейса, тогда как в варианте B служба может воспроизводить данные и передавать только требуемый / минимум на уровень пользовательского интерфейса после сопоставления (в ViewModel).
Но, давайте предположим, что мы перейдем к варианту A, мы поместим ViewModel на уровень пользовательского интерфейса (и модель сущностей на уровень Service).
Если уровень сервиса должен отображаться на ViewModel, то слой сервиса должен иметь доступ к ViewModel на уровне пользовательского интерфейса. Какая библиотека / проект? Модель представления должна находиться в отдельном проекте на уровне пользовательского интерфейса, и на этот проект должен ссылаться сервисный уровень. Если ViewModel не находится в отдельном проекте, то есть круговая ссылка, поэтому не стоит. Выглядит неловко, когда сервисный уровень получает доступ к пользовательскому интерфейсу, но все же мы могли бы справиться с этим.
Но что, если есть другое приложение пользовательского интерфейса, использующее этот сервис? Что делать, если есть мобильное приложение? Насколько может отличаться ViewModel? Должна ли Служба получать доступ к одному и тому же проекту модели представления? или все проекты пользовательского интерфейса будут конкурировать?
После этих соображений мой ответ будет состоять в том, чтобы поместить проект Viewmodel в Service Layer. Каждый уровень пользовательского интерфейса в любом случае должен иметь доступ к уровню сервиса! И может быть много похожих ViewModel, которые они все могут использовать (следовательно, отображение становится проще для уровня обслуживания). В наши дни сопоставления выполняются через linq, что является еще одним плюсом.
Наконец, есть обсуждение DTO. А также об аннотации данных во ViewModels. ViewModels с аннотациями данных не могут находиться на уровне сервиса. Таким образом, DTO будет точной копией ViewModel с отображением один на один между двумя (скажем, с AutoMapper). Опять же, DTO по-прежнему обладает логикой, необходимой для пользовательского интерфейса (или нескольких приложений), и находится на уровне обслуживания. А слой пользовательского интерфейса ViewModel предназначен только для копирования данных из DTO с добавлением некоторого «поведения» (например, атрибута).
Хотя это не имеет прямого отношения к вопросу. 'ViewModel Façade' (viewmodel внутри другой viewmodel) & 'command', упомянутые в этом разделе, должны смотреть канал 9, ссылка также стоит изучить (@ 11: 48 начинается)