Содержание
Третий элемент MVC — модель. Именно этот компонент в нашем приложении должен отвечать за всю бизнес-логику — проводить необходимые вычисления, анализ данных и т.д. Как правило, в приложении ASP.NET Core MVC используются различные сущности, например, сущность «пользователь», «книга», «книжный шкаф» и т.д. Как правило (но не всегда), для каждой сущности создается своя модель в виде POCO-класса (plain-old CRL objects), то есть класса без каких-либо зависимостей, методов и атрибутов.
Виды моделей в ASP.NET Core MVC
Анемичная модель предметной области
Анемичная модель предметной области (Anaemic Domain Model) — модель состоящая только из свойств и не содержащая какой-либо бизнес-логики. Например, ранее мы использовали вот такую анимичную модель для описания статьи блога:
public class Post { public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public string Body { get; set; } }
здесь нет никаких методов (бизнес-логики) и всё, что делает эта модель — хранит свое состояние в свойствах. Довольно часто анемичные модели подвергаются критики и определяются как антишаблон, но всё же стоит отметить, что такие модели прекрасно подходят, например, для того, чтобы использовать их для хранения информации, полученной из какой-нибудь базы данных.
Богатая (толстая) модель предметной области
В противовес анемичной модели, богатая модель предметной области (Rich Domain Model) может содержать бизнес-логику. Например, мы могли бы создать вот такую модель:
public class Post { public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public string Body { get; set; } public override string ToString() { return $"{Id} - {Title} - {Author}"; } public int Length() { return Body.Length; } }
эта модель уже имеет какое-то поведение в виде двух методов. Более того, мы можем добавить в модель атрибуты валидации, обеспечить модели самовалидацию и т.д.
Виды моделей в ASP.NET Core MVC
Что касается разделения моделей в ASP.NET Core MVC, то условно их можно подразделить на три вида:
- модели для работы с базами данных. Чаще всего, это анемичные модели
- модели представлений
- вспомогательные модели для промежуточных вычислений
Модели представлений — это те модели, объекты которых предназначены непосредственно для их передачи в представления. Например, возвращаясь к модели статьи блога, каждая статья относится к какой-либо рубрике (или нескольким рубрикам) в блоге. Мы можем хранить рубрики также в базе и создать для них такую модель:
public class Rubric { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } }
И теперь мы решили создать представление для статьи блога с выводом информации о рубриках. Но, при попытке в представлении использовать несколько типов моделей вот так:
@model Post @model Rubric[]
мы неизбежно получим ошибку, так как директива @model
должна быть всего одна на весь документ. В этом случае, мы можем создать модель представления следующим образом:
public class PostView: Post { public Rubric[] Rubrics { get; set; } }
и уже эту модель использовать в представлении:
@model PostView
Часто, для моделей представления выделяется отдельная папка в проекте — ViewModels
, а для других моделей — папка Models
. И, хотя эти папки необязательны и модели мы можем хранить хоть в корне проекта, наличие таких папок делает структуру вашего проекта более понятной.
Что касается вспомогательных моделей, то здесь могут быть какие угодно модели, которые нам потребуются для вычислений, но которые не будут использоваться в представлениях или для хранения сведений из БД.
Итого
В зависимости от сложности проекта, одна и та же модель может выступать и моделью для БД и моделью представления (и даже включать в себя элементы вспомогательной модели) быть анемичной или богатой. Однако, если предполагается разработка более менее сложного по структуре и функциям проекта, то стоит заранее озаботиться на предмет того, какие модели будут использоваться в вашем проекте. В дальнейшем мы сосредоточимся на изучении различных моментов по использованию моделей в ASP.NET Core MVC.