Где в системе MVC должен находиться код персистентности базы данных?

21

Я видел несколько конфигураций для сохранения информации в базе данных. Как правило, три типа дизайна кажутся распространенными в моем уголке мира:

  • Контроллер управляет постоянством
  • Модель управляет постоянством
  • Сторонняя библиотека управляет постоянством, обычно требуя какие-то аннотации к модели.

Мне интересно, какая конфигурация (если таковая имеется), концептуально, наиболее проста в использовании / наиболее совместима с архитектурой MVC?

(Если это не тот, который я перечислил, пожалуйста, дайте краткий план / обзор как часть ответа)

blueberryfields
источник

Ответы:

13

Ваш второй и третий варианты идентичны. M в MVC - это не модель данных, а модель предметной области. Это включает в себя постоянство, будь то напрямую или через ORM, и оба совершенно правильно.

Контроллер должен управлять потоком сайта и передавать материал в домен (иногда через уровень обслуживания) для обработки, поэтому сохранение его оттуда неправильно - или, по крайней мере, семантически неудобно.

прецизионный самописец
источник
2
Я не согласен в определенной степени. Конкретное использование постоянства является логикой приложения и, следовательно, относится к прикладному уровню, а не к доменному уровню. Уровень домена (содержащий модель домена) должен игнорировать постоянство для случайной бизнес-программы. Контроллер является оркестратором . Он может управлять (данными) сервисами, пользовательским интерфейсом и моделью предметной области.
Сокол
1
@Falcon: хотя контроллер должен контролировать, когда данные загружаются из базы данных и сохраняются в ней, вполне нормально, если он скажет модели сделать это. Использование ORM (стандартного или собственного) обычно означает указание модели загрузить / сохранить, которая затем делегирует ORM. Другой способ - заставить контроллер сообщить ORM о загрузке / сохранении чего-либо, передав ему класс модели для загрузки (с критериями выбора) или экземпляр модели для сохранения. В любом случае фактическая загрузка / сохранение будет неразрывно связана с моделью.
Марьян Венема
@Marjan Venema: Да, я согласен, но вопрос в том, где этот код должен жить. Я стараюсь держать модель как можно более невежественной в отношении постоянства и моделирую только доменные сущности с их поведением и взаимодействием. Все остальное будет жить в прикладных слоях (так как это приложение моей модели). Отображение доступа к информации / данным полностью отделено от модели предметной области и может также обеспечивать управление версиями (обновление / понижение версии). Приложение доступа к данным также живет на прикладных уровнях (которые содержат сервисы, репозитории и т. Д.)
Сокол
@Falcon: Да, это хороший способ сделать это, и именно так я делал это в прошлом, используя отдельные классы отображения. Однако с появлением расширенного RTTI (Delphi) и рефлексии (.Net и др.) У меня нет никаких сомнений по поводу их использования в сочетании с аннотацией атрибутов модели бизнес-объектов для начала работы и просто использования перегрузок, кодовых хуков в и / или специально закодированные классы инициализации, чтобы заботиться о версиях базы данных.
Марьян Венема
5

На самом деле, MVC - это в основном шаблон реализации пользовательского интерфейса, поэтому вопрос несколько спорный. Тем не менее, на самом деле есть только два варианта большой картинки. Ваш контроллер обычно отправляет запросы на загрузку или сохранение сущностей в вашей модели, используя либо 1) некоторый уровень обслуживания, либо 2) шаблон Active Record.

Уровень обслуживания может принимать любую из нескольких форм, хотя я лично предпочитаю работать с абстракцией репозитория для агрегированных корневых сущностей, конкретные реализации которых будут работать либо с каким-либо ORM, либо с облегченным DAO, либо с API для некоторого нереляционного хранилища, если это имеет смысл для приложения.

Шаблон Active Record означает, что ваша модель несет ответственность за постоянство, хотя обычно это означает, что некоторый базовый класс управляет отображениями в вашем магазине, поэтому ваша модель на самом деле не имеет такого непосредственного участия.

По сути, контроллер отправляет запросы на сохранение объектов, будь то вызов вашего репозитория, реализация UnitOfWork или метод Save для ваших объектов. Если вы используете репозитории, ваши объекты модели игнорируют постоянство.

JasonTrue
источник
3

В системе MVC (модель-представление-контроллер) модель содержит данные. Поэтому я считаю, что в этом должно быть постоянство базы данных.

Nettogrof
источник
2

Большинство высокоуровневых примеров MVC, которые я видел, имеют отдельный infrastructureуровень, который имеет реальный код реализации базы данных (то есть конкретные вызовы NHibernate, или EF или Linq или любой другой уровень данных), в то время как уровень «модель» (часто также уровень «Домен») имеет интерфейсы, которые определяют службы данных.

Уэйн Молина
источник
0

Стандартной практикой в ​​MVC является включение структуры данных и персистентности в слой M (odel).

Слой модели включает в себя не только классы (POCO и т. Д.), Которые вы собираетесь использовать в своем приложении. Они включают в себя хранилища для этих классов.

Примером может служить репозиторий, в котором у вас есть наборы экземпляров классов данных, т.е.

Clients repository

AllClients()
RecentClients()
ClientByID(int id)

Вы сможете лучше организовать свой домен модели, а также получить доступ к вашим данным многими способами, но слой данных / модели все равно будет компактным и надежным

Михалис Багос
источник