Ответ 1
Все это зависит от намерений и требований вашего приложения.
Это говорит о том, что здесь мое предложение для веб-приложений "среднего масштаба" (а не в местном ресторане, а не в Twitter/Facebook).
-
Моделирование Lean Domain
Сухие объекты стиля POCO, предпочтительно неосведомленные к архитектуре MVC вашего веб-приложения, чтобы оставаться столь же слабо связанными с вашей конкретной реализацией, насколько это возможно. Возможно, даже библиотека классов, пригодная для использования во внешнем приложении, скажем, REST API через Веб-служба WCF).
"Модель" в MVC наиболее точно означает модель, о которой знает контроллер, и, следовательно, модель, предназначенная для представления.
В более мелких (часто обучаемых) приложениях модели сущностей вашего "уровня модели приложений/доменов" часто являются теми же экземплярами объектов, которые контроллер отправляет в представление.
В больших приложениях разработчики часто используют принципы архитектуры MVVM и начинают использовать отдельные объекты View Model. Контроллеры часто называют услуги среднего уровня, которые работают с невидимыми объектами ниже. В этом случае M в MVC наиболее точно означает View Model.
-
Надежный уровень обслуживания
Это не означает тучную логику, но хорошо написанные одноцелевые сервисы. Хотя кодирование вашей бизнес-логики в сервисах за пределами модели является немного более "процедурным", чем чистым "ООП", оно помогает в значительной степени с помощью сочетания, тестирования и гибкого развертывания (например, развертывание n-уровня).
В моей личной практике я кодирую службы как на уровне данных, которые я считаю своим поведенческим моделированием объектов POCO (механика устойчивости, низкоуровневая проверка и т.д.), так и сервисы более высокого уровня (функция бизнес/рабочий процесс) ближе к механике MVC.
-
Lean Controllers
Я уверен, что мой контроллер - это просто тренер, поскольку он не является ни игрой (услугами), ни игроком (модель сущности или модель представления), а просто решает, кто играет какую позицию и какую игру делать. Мои контроллеры выполняют две вещи:
-
Службы вызовов, которые взаимодействуют с объектом/доменом Модели
-
Подготовьте модель просмотра для соответствующего вида.
Даже аутентифицированные/санкционированные действия контроллера выполняются через внедренные службы/атрибуты.
-
РЕДАКТИРОВАТЬ 1:
Имейте в виду, что это не означает, что ваша модель Entity/Domain является или должна быть анемичной. ORM, репозитории и фабрики, валидация или государственная механика приветствуются. Это означает только для приложений с умеренным масштабом, модель в MVC представляет собой модель, предназначенную для контроллера, для передачи на ваш вид.
Надеюсь, этот момент успокоит апостолов Фаулера, которые считают, что модель анемических данных является анти-паттерном. В то же время он отражает немного более процедурный угол, чем ООП, где более чисто, чтобы включать поведение в моделируемые классы.
Нет никакой "истины", но при использовании этого шаблона вам будет легко создавать, тестировать и развертывать ваши приложения, сохраняя при этом много повторного использования и масштабируемости.
ИЗМЕНИТЬ 2:
Тем не менее, даже для приложений с небольшим размером, по сравнению с архитектурой (что составлено слово "ботаники"?) система слишком распространена. Например, обертывание ORM с шаблоном репозитория, а затем создание служб для использования репозитория... все это полезно для разделения беспокойства и тому подобного, но если ваш проект не требует (и вряд ли потребуется в ближайшее время ) такие вещи, не стройте его. Нет ничего плохого в пропуске репозитория вместе, написании тонких бизнес-сервисов (например, классов запросов) по сравнению с ORM или даже при наличии вашего диспетчера непосредственно с ним. Все зависит от масштаба.
ИЗМЕНИТЬ 3:
Я хотел бы отметить, что это объяснение и советы предназначены для контекстной архитектуры MVC на стороне сервера, такой как ASP.Net, а не для кластерных фреймворков, таких как Knockout или Backbone.