Когда вы исходите из паттерна MVVM и начинаете с паттерна MVC (особенно ASP.NET MVC), я бы посоветовал думать о паттерне "MVC" лучше, чем о "VMVC", потому что "M" в MVC - это не Модель означает «М» в MVVM. Это на самом деле соответствует ViewModel . Я не знаю, соответствует ли это общему определению MVC, но оно верно и является наиболее используемой и наилучшей практикой, когда вы работаете с ASP.NET MVC (хотя вы время от времени видите здесь примеры или вопросы по SO, где доменные сущности являются используется в представлении (что иногда и является причиной проблемы, описанной в вопросе)).
Первое, что я обычно делаю, когда создаю проект ASP.NET MVC из одного из шаблонов Visual Studio, - переименовываю созданную папку «Модель» в «ViewModel». Если вы посмотрите, что код шаблона делает с этими «моделями», вы увидите, что они непосредственно используются для представлений, что у них есть аннотации данных для проверки ввода, форматов отображения и, возможно, именования полей в представлении. Эти аннотации частично используются непосредственно помощниками HTML для создания HTML и не представляют домен или бизнес-логику. Другими словами: они являются ViewModel для представления Razor / HTML в том же смысле, в каком вы используете ViewModels в MVVM для представлений XAML в WPF / Silverlight / Phone7.
Домен «Модель» фактически не является частью шаблона MVC, поскольку он является частью шаблона MVVM. Таким образом, сокращения несколько вводят в заблуждение, когда вы сравниваете MVVM с MVC. В качестве очень упрощенной «таблицы перевода» можно сказать:
MVVM MVC
---- ---
M -> Domain Model not part of the pattern
V -> View (XAML) V -> View (HTML, Razor)
VM -> ViewModel M -> ViewModel
not part of the pattern C -> Controller
Я не уверен насчет соответствующего контроллера в MVVM. В MVC контроллером обычно является модуль, который переводит доменные объекты в ViewModels, а затем в представления (и наоборот) - схематично:
ControllerActionForGetRequest ( params )
{
objects = GetDomainObject(params) - entities, queryables or DTOs
viewModel = CreateViewModelFromDomainObjects(objects)
view = CreateViewFromViewModel(viewModel)
}
ControllerActionForPostRequest ( viewModel )
// ModelBinder makes "viewModel" from HTML input fields, etc
{
if (IsValid(viewModel))
{
data = CreateDomainObjectsOrDtosFromViewModel(viewModel)
WriteData(data) - back to data store
RedirectToActionForGetRequest
}
else
GoBackToView
}
Какая часть в MVVM несет эту ответственность? Я не уверен. Я видел проекты, в которых ViewModel содержит некоторую ссылку на репозиторий, вытаскивает модель (модель домена), чтобы заполнить свои собственные свойства, и записывает обратно в репозиторий через обработчики ICommand. Это означало бы, что ViewModels в MVVM также должны быть «контроллерами», тогда как ViewModels в MVC намного проще: они являются более или менее единственными пакетами свойств с метаданными для предоставления и форматирования данных для представления.
В качестве последнего замечания: лично я обнаружил, что шаблон MVVM с WPF намного сложнее освоить, чем шаблон MVC. ASP.NET MVC спроектирован с нуля для поддержки разработки, ориентированной на шаблоны MVC, и нет необходимости (или даже не возможности) уходить с этого пути. Это не относится к WPF. Оригинальный дизайн был построен с учетом представлений и файлов с выделенным кодом, а не с шаблоном MVVM. Я часто сталкивался с ситуациями, когда было очень трудно привязать элементы представления или атрибуты к ViewModel, и обработка этого в файлах, выполняющих код, была намного проще, что немного нарушало принципы MVVM.
Я бы подумал, что у вас не возникнет проблем с входом в MVC, если вы имеете опыт работы с шаблоном MVVM.