DDD и MVC: разница между "моделью" и "сущностью"
Я серьезно запутался в концепции "Модели" в MVC. Большинство существующих в настоящее время фреймворков помещают модель между контроллером и базой данных, а модель почти действует как слой абстракции базы данных. Концепция "Fat Model Skinny Controller" теряется, поскольку контроллер начинает все больше и больше логики.
В DDD существует также понятие Domain Entity, которое имеет для него уникальный идентификатор. Насколько я понимаю, пользователь - хороший пример Entity (например, уникальный идентификатор пользователя). Сущность имеет жизненный цикл - значения могут меняться в течение всего действия, а затем сохраняются или отбрасываются.
Сущность, описанная выше, - это то, что я думал, что модель должна находиться в MVC? Как вне базы я?
Чтобы загромождать вещи больше, вы бросаете другие шаблоны, такие как шаблон репозитория (возможно, размещая там Сервис). Это довольно ясно, как Repository будет взаимодействовать с Entity - как это происходит с моделью?
Контроллеры могут иметь несколько моделей, что делает его похожим на модель, которая меньше "таблица базы данных", чем уникальная сущность.
ОБНОВЛЕНИЕ: В этом сообщении Модель описывается как что-то со знанием, и она может быть сингулярной или сбор объектов. Так что это больше похоже на сущность и модель, более или менее одинаковые. Модель является всеохватывающим термином, где сущность более конкретна. Объектом Value также будет модель. По крайней мере, с точки зрения MVC. Может быть???
Итак, в очень грубых выражениях, что лучше?
Нет "модели" действительно...
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
Или это, у которого есть модель как DAO?
class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}
Оба этих примера даже не делали то, что я описывал выше. Я явно потерян. Любой вход?
Ответы
Ответ 1
Entity
Entity
означает объект, который является одним элементом, с которым работает бизнес-логика, а точнее те, которые имеют личность какого-то типа.
Таким образом, многие люди ссылаются на ORM-сопоставленные объекты как объекты.
Некоторые называют "сущность" классу, экземпляр которого представляет собой одну строку в базе данных.
Некоторые другие люди предпочитают вызывать только те из этих классов как "сущность", которые также содержат бизнес-правила, валидацию и общее поведение, а другие называют "объектами передачи данных".
Model
A Model
- это то, что напрямую не связано с UI (= View
) и потоком управления (= Controller
) приложения, а скорее как способ доступа к данным и абстракции основных данных приложение работает.
В принципе, все может быть моделью, которая соответствует приведенному выше.
MVC
Вы можете использовать объекты в качестве моделей в MVC. Они означают две разные вещи, но одни и те же классы можно назвать обоими.
<сильные > Примеры
- Класс
Customer
- это сущность (обычно), и вы также используете ее как часть доступа к данным в своем приложении. В этом случае это как объект, так и модель.
- Класс
Repository
может быть частью Модели, но он явно не является сущностью.
- Если есть класс, который вы используете в середине уровня бизнес-логики, но не подвергаете его остальной части приложения, это может быть объект, но он явно не является моделью с точки зрения MVC приложение.
Ваш пример
Что касается ваших примеров кода, я бы предпочел первый.
Модель - это класс, который используется как средство абстракции данных приложения, а не класс, который имеет имя, суффикс с "Моделью". Многие люди рассматривают последнюю вирусы.
Вы можете в значительной степени рассмотреть свой класс репозитория как часть вашей модели, даже если его имя не суффикс с "Моделью".
Я бы добавил, что тот факт, что также легче работать с первым, и для других людей, которым позже может понадобиться понять ваш код, легче понять.
Ответ 2
Все ответы - это тяжелый mashup разных вещей и просто неправильный.
Модель в DDD очень похожа на модель в реальном мире:
Упрощение и абстракция чего-то.
Не меньше и не больше.
Он не имеет ничего общего с данными, объектами или чем-то еще.
Это просто понятие доменной части. А также в каждом сложном домене
всегда существует более одной модели, например. Торговля, выставление счетов, логистика.
Сущность не является "моделью с идентификатором", а просто объектом с идентификатором.
Репозиторий - это не только кеш 1-го уровня, но и часть домена.
Это дает иллюзию объектов в памяти и отвечает за выборку
Агрегаты (не сущности!) Из любого места и их сохранение
т.е. поддержание жизненного цикла объектов.
Если вы говорите о концепциях DDD, сначала исправьте свои знания, прочитав основы.
Как здесь ThinkDDD.
Ответ 3
"Модель" в вашем приложении - это бит, который хранит ваши данные. "Сущность" в доменном дизайне, если я правильно помню, представляет собой модель с идентификатором. Иными словами, сущность - это модель, которая обычно соответствует непосредственно "физическому" элементу в базе данных или файле. Я считаю, что DDD определяет два типа моделей: один - сущность, другой - значение, которое является просто моделью без и идентичности.
Шаблон репозитория - это всего лишь тип индексированного набора моделей/сущностей. Так, например, если ваш код хочет заказать номер 13, он сначала спросит у него репозиторий, и если он не сможет его получить, он отправится и доставит его откуда угодно. Это в основном кеш уровня 1, если хотите. Нет никакой разницы в том, как она действует с моделью, и как она действует с сущностью, но поскольку идея репозитория заключается в возможности извлечения моделей с использованием их идентификаторов, с точки зрения DDD, в хранилище.
Ответ 4
Простое решение, использующее сервис и сбор:
<?php
class MyController {
public function index() {
$postService = ServiceContainer::get('Post');
$postCollection = $postService->findAllByDateRange('within 30 days');
while($postCollection->getNext()) {
echo $postCollection->current()->getAuthor();
}
}
}
EDIT:
Модель (класс) представляет собой простое представление схемы сущности. Модель (объект) - это единое целое. Служба работает с моделями и предоставляет конкретные данные контроллеру s. Никакой контроллер не имеет модели. Модели автономны.
С другой стороны, карты отображают модели в уровни устойчивости (например, базы данных, сторонние бэкэнд и т.д.).
Ответ 5
в то время как это особенно касается Ruby on Rails, те же принципы и информация все еще применяются, поскольку обсуждение происходит вокруг MVC и DDD.
http://blog.scottbellware.com/2010/06/no-domain-driven-design-in-rails.html