Я сделал этот пост больше года назад, и я думаю, что имеет смысл обновить его, поскольку он получает довольно много просмотров.
Я либо что-то пропустил, либо Microsoft действительно перепутала MVC. Я работал над проектами Java MVC, и они были чистыми и простыми. Это, однако, полный беспорядок IMO. Примеры онлайн, такие как NerdDinner и проекты, обсуждаемые в ASP.Net, слишком просты, поэтому они "просто" работают. Извините, если это звучит отрицательно, но это мой опыт.
У меня есть репозиторий и служба, которая ссылается на репозиторий. Контроллеры звонят по телефону.
Мой уровень данных НЕ является постоянным, поскольку классы были сгенерированы SQL-металом. Из-за этого у меня много ненужной функциональности. В идеале я бы хотел иметь POCO, но пока не нашел хорошего способа достичь этого.
* Обновление: Конечно, Microsoft ничего не испортила - я это сделал. Я не совсем понял инструменты, которые были в моем распоряжении. Главным недостатком в том, что я сделал, было то, что я выбрал неправильную технологию для сохранения моих сущностей. LINQ to SQL хорошо работает в приложениях с поддержкой состояния, поскольку контекст данных можно легко отслеживать. Однако это не относится к контексту без атак. Какой был бы правильный выбор? Код Entity Framework сначала или код работают очень хорошо, но что более важно, так это то, что это не имеет значения. MVC или приложения на передней панели не должны знать, как сохраняются данные. *
При создании entites я могу использовать привязку объектов:
[HttpPost]
public ActionResult Create(Customer c)
{
// Persistance logic and return view
}
Это отлично работает, MVC делает некоторые привязки за сценой, и все "весело".
Это не было "Веселой Доброй". Клиент был моделью домена, и, что еще хуже, он зависел от среды постоянства, потому что он был создан SQL metal. Теперь я буду создавать модель моего домена, которая не зависит от уровней хранения данных или уровня представления. Затем я бы создал модель представления из моей модели домена и использовал ее.
Как только я захочу сделать что-то более сложное, например. - сохранить заказ, связанный с клиентом, все, кажется, сломается:
[HttpPost]
public ActionResult Create(Order o)
{
// Persistance logic and return view
}
Чтобы сохранить заказ, мне нужен Клиент или, по крайней мере, CustomerId. CustomerId присутствовал в представлении, но к тому времени, когда он получил метод Create, он потерял CustomerId. Мне не нравится сидеть вокруг отладки кода MVC, так как я не смогу изменить его в среде хостинга в любом случае.
Хорошо, немного стонать здесь, извините. Теперь я создам модель представления, называемую NewOrder, или SaveOrder, или EditOrder в зависимости от того, чего я пытаюсь достичь. Эта модель представления будет содержать все свойства, которые меня интересуют. Автоматическая привязка из коробки, как следует из названия, свяжет переданные значения и ничего не будет потеряно. Если я хочу пользовательское поведение, тогда я могу реализовать свою собственную "привязку", и он выполнит эту работу.
Альтернативой является использование FormCollection:
[HttpPost]
public ActionResult Create(FormCollection collection)
{
// Here I use the "magic" UpdateModel method which sometimes works and sometimes doesn't, at least for LINQ Entities.
}
Это используется в книгах и учебниках, но я не вижу смысла в методе, который имеет альтернативу: TryUpdateModel - если этот сбой или модель недопустимы, он пытается обновить его в любом случае. Как вы можете быть уверены, что это сработает?
Автообязательность с моделями просмотра будет работать большую часть времени. Если это не так, вы можете переопределить его. Откуда вы знаете, что это всегда будет работать? Вы unit test и хорошо спать.
Другой подход, который я пробовал, заключается в использовании объектов ViewModel - wrapper с правилами проверки. Это звучит неплохо, за исключением того, что я не хочу добавлять аннотации к классам Entity. Этот подход отлично подходит для отображения данных, но что вы делаете, когда речь идет о записи данных?
[HttpPost]
public ActionResult Create(CustomViewWrapper submittedObject)
{
// Here I'd have to manually iterate through fields in submittedObject, map it to my Entities, and then, eventually, submit it to the service/repository.
}
** Просмотр модели - хороший путь вперед. Там должен быть некоторый код преобразования из модели представления в модель домена, который затем может быть передан соответствующей службе. Это не правильный путь, но это один из способов сделать это. Инструменты автоматического сопоставления - это ваши лучшие друзья, и вы должны найти тот, который соответствует вашим требованиям, иначе вы будете писать тонны кода шаблона. **
Я что-то упустил или так работает Microsoft MVC3? Я не вижу, как это упрощает вещи, особенно в сравнении с Java MVC.
Прошу прощения, если это звучит отрицательно, но до сих пор это был мой опыт. Я ценю тот факт, что структура постоянно совершенствуется, внедряются такие методы, как UpdateModel, но где находится документация? Может быть, пора остановиться и немного подумать? Я предпочитаю, чтобы мой код был последовательным во всем, но с тем, что я видел до сих пор, я не уверен, что это правильный путь вперед.
Мне нравится фреймворк. Есть так много, чтобы учиться, и это не намного более захватывающее, чем когда-либо было. Возможно, нужно сделать еще одну запись в отношении веб-форм. Надеюсь, это будет полезно.