Связанность моделей в MVC

Рейтинг: 1Ответов: 1Опубликовано: 14.06.2023

Пытаюсь окончательно разобраться в паттерне Model-View-Controller. Очевидно, всю бизнес-логику лучше размещать в моделях, чтобы избежать «толстых тупых уродливых контроллеров». Но как быть с методами, которые одновременно касаются множества моделей?

Скажем, оформление заказа может затронуть модели заказа, товаров, пользователя, доставки, скидок. Если мы решили размещать бизнес-логику в моделях, где будет храниться метод оформления заказа и как при этом правильно работать со связанными моделями? Передавать их объекты в качестве аргументов?

Или функционал, связанный со множеством моделей, выносить в отдельный класс? Если так, в какое место в структуре приложения его поместить, чтобы не нарушать принципы MVC?

Помогите разобраться.

Ответы

▲ 1Принят

Или функционал, связанный со множеством моделей, выносить в отдельный класс? Если так, в какое место в структуре приложения его поместить, чтобы не нарушать принципы MVC?

В таких случаях можно использовать следующий подход:

Разместить методы, связанные с множеством моделей, в одной из моделей:

Создать отдельный класс или слой сервисов для работы со связанными моделями:

Если функциональность касается нескольких моделей и не является прямой ответственностью одной из них, можно создать отдельный класс или слой сервисов, который будет выполнять операции со связанными моделями. Этот класс может содержать методы, связанные с бизнес-логикой, и работать с различными моделями через их интерфейсы. Такой подход помогает избежать перегрузки одной модели функциональностью, которая не относится к ее основной ответственности. Важно учесть, что в MVC модель не обязательно должна быть просто классом, она может представлять собой группу связанных классов или компонентов. Главное, чтобы бизнес-логика и ответственность за данные были взаимосвязаны и логически организованы.

Чтобы полностью исключить логику в контроллерах или загруженность в одной из моделей используйте Сервисы для взаимодействия разных сущностей в одном классе. Эти сервисы можно хранить в Библиотеке классов и назвать её типа yourProjectName.Data -> Services -> CheckoutService В свою очередь CheckoutService и будет включать в себя взаимодействие всех необходимых сущностей для оформления заказа