Существует много представлений об этом, но, по моему опыту, есть 2 основных представления Model
:
ViewModel
Это POCO, который просто содержит все необходимые данныедля отображения View
.Данные обычно заполняются Controller
.
Fat Model, Skinny Controller
Model
выполняет большую часть бизнес-работы.Он содержит и заполняет все данные, необходимые для View
, и используется Controller
для сохранения данных и т. Д.
Красота MVC
Красота MVCэто то, что он открыт!Вы можете выбрать любой тип модели, который вам нужен ... вы можете поместить все свои данные в ViewState
, в Model
, в ViewModel
, который содержит набор Model
s, что угодно.Это действительно зависит от вас.Модель, Вид и Контроллер - это пустые холсты, которые можно использовать по своему усмотрению.
Что я использую
Моя команда проделала большую работу по MVC, и мы попробовали многие из нихразные методы.Мы, наконец, решили, что нашим фаворитом была парадигма Fat Model, Skinny Controller .
Я считаю, что этот паттерн лучше всего подходит для "простоты" и "не повторяйся", и это определенноподдерживает «разделение интересов».
Вот как организован наш код:
- Контроллеры
- Обрабатывает все, что относится к HTTP-запросам - перенаправления, аутентификация, веб-безопасность, кодированиеи т. д.
- Предоставляет все "входные данные" для
Model
и дает Model
для представления.НЕ получает доступ к бизнес-уровням или слоям данных.
- Представления
- Обрабатывает все поколения HTML и JSON
- Доступ только к данным со строго типизированным
Model
- Модели
- Отвечает за выполнение всех обновлений, вызов бизнес-уровней и слоев данных, загрузку всех данных
- Обрабатывает все проверки и ошибки и возвращает ихКонтроллер
- Содержит свойства всех данных, которые требуются для
View
, и заполняет себя
Даже если это звучит как общий принцип MVCбыстро становится очевидным, что MVC не требует этих принципов, поэтому многие проекты используют другие принципы.
Пример
Вот пример Model
.Контроллер создает его, он сам заполняет, и Контроллер передает его в представление.
public class UsersModel
{
protected UserBusiness userBusiness = new UserBusiness();
public UsersModel(string editUserName)
{
// Load all users:
this.Users = userBusiness.GetAllUsers();
// Load the user to be edited:
this.EditUser = (editUserName == null) ? null : userBusiness.GetUser(editUserName);
}
public List<User> Users { get; private set;}
public User EditUser { get; private set; }
}
Вся «пользовательская бизнес-логика» в этом случае находится в другом проекте (наш «Бизнес-уровень»), потому что у нас большая система.Но для небольших проектов этого не требуется ... Модель может содержать бизнес-логику и даже код доступа к данным.