DDD и MVC: разница между «моделью» и «сущностью» - PullRequest
50 голосов
/ 13 июня 2010

Я серьезно запутался в концепции «Модель» в MVC.Большинство существующих сегодня фреймворков помещают Модель между Контроллером и базой данных, а Модель почти действует как слой абстракции базы данных.Понятие «Толстый Тощий Контроллер Модели» теряется, когда Контроллер начинает выполнять все больше и больше логики.

В DDD также существует концепция Доменного Сущности, которая имеет уникальную идентичность.Насколько я понимаю, пользователь - хороший пример сущности (например, уникальный идентификатор пользователя).У сущности есть жизненный цикл - его значения могут изменяться в течение всего действия - и затем он сохраняется или удаляется.

Сущность, которую я описал выше, - это то, что, как я думал, должна быть модель в MVC?Насколько я вне базы?

Чтобы еще больше загромождать вещи, вы добавляете другие паттерны, такие как паттерн репозитория (возможно, размещая там Сервис).Довольно ясно, как репозиторий будет взаимодействовать с сущностью - как он работает с моделью?

Контроллеры могут иметь несколько моделей, из-за чего кажется, что модель - это не "таблица базы данных", а модель.уникальная сущность.

ОБНОВЛЕНИЕ: В этом посте Модель описывается как нечто со знанием, и она может быть единичной или совокупностью объектов.Так что это звучит больше как сущность и модель более или менее одинаковы.Модель - это всеобъемлющий термин, в котором сущность является более конкретной.Объект значения также будет моделью.По крайней мере, с точки зрения 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;
        }
    }
}

Оба эти примера даже не делали то, что я описывал выше.Я явно потерян.Любой вход?

Ответы [ 5 ]

45 голосов
/ 13 июня 2010

Entity

Entity означает объект, представляющий собой отдельный элемент, с которым работает бизнес-логика, более конкретно, объекты, имеющие определенную идентичность.
Таким образом, многие люди называют ORM-отображаемые объекты как сущности.

Некоторые называют " сущность " для класса, экземпляр которого представляет одну строку в базе данных.

Некоторые другие люди предпочитают называть только те из этих классов как «сущности», которые также содержат бизнес-правила, проверку и общее поведение, а другие называют « объектами передачи данных ».

Модель

A Model - это то, что напрямую не связано с пользовательским интерфейсом (= View) и потоком управления (= Controller) приложения, а скорее с тем, как осуществляется доступ к данным и основная абстракция данных приложение работает.

В принципе, любая модель может соответствовать вышеперечисленному.

MVC

Вы можете использовать сущности в качестве моделей в MVC. Они означают две разные вещи, но одни и те же классы можно назвать обеими.

Примеры

  • Класс Customer очень похож на сущность (обычно), и вы также используете его как часть доступа к данным в вашем приложении. В данном случае это и сущность, и модель.
  • Класс Repository может быть частью Модели, но он явно не является сущностью.
  • Если есть класс, который вы используете в середине уровня бизнес-логики, но не открываете его остальной части приложения, это может быть сущность, но она явно не Модель с точки зрения MVC приложение.

Ваш пример

Что касается примеров кода, я бы предпочел первый.
Модель - это класс, который используется в качестве средства абстрагирования данных приложения, а не класс, имя которого имеет суффикс «Модель». Многие считают последний вздор.

Вы можете в значительной степени рассматривать ваш класс Repository как часть вашей модели, даже если к его имени не добавляется суффикс "Model".

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

10 голосов
/ 08 февраля 2011

Все ответы - это множество разных вещей и просто неправильные.

Модель в DDD очень похожа на модель в реальном мире: упрощение и абстракция чего-либо.Не меньше и не больше.Это не имеет ничего общего с данными, объектами или чем-то еще.Это просто концепция доменной части.А также в каждой сложной области всегда существует более одной модели, например, Торговля, Выставление счетов, Логистика.

Сущность - это не «модель с идентичностью», а просто объект с идентичностью.

Хранилище - это не только кэш 1-го уровня, но и часть домена.Он создает иллюзию объектов в памяти и отвечает за выборку Агрегатов (не сущностей!) Из любого места и сохранение их, то есть поддержание жизненного цикла объектов.

Если вы говорите о концепциях DDD, сначала закрепите свои знания,чтение основ.Как здесь ThinkDDD .

6 голосов
/ 13 июня 2010

«Модель» в вашем приложении - это бит, содержащий ваши данные. «Сущность» в доменном дизайне - это, если я правильно помню, модель с идентичностью. То есть сущность - это модель, которая обычно соответствует непосредственно «физическому» элементу в базе данных или файле. Я полагаю, что DDD определяет два типа моделей, один из которых является сущностью, а другой - значением, которое представляет собой просто модель без идентичности.

Шаблон репозитория - это просто тип индексированной коллекции моделей / сущностей. Так, например, если ваш код хочет порядок № 13, он сначала запросит его у хранилища, а если он не сможет получить его оттуда, он пойдет и получит его откуда угодно. По сути, это кеш уровня 1, если хотите. Нет разницы в том, как он действует с моделью и как он действует с сущностью, но поскольку идея репозитория заключается в том, чтобы иметь возможность извлекать модели с использованием их идентификаторов, с точки зрения DDD, только сущности будут допущены в хранилище.

1 голос
/ 13 июня 2010

, хотя речь идет именно о Ruby on Rails, все еще применяются те же принципы и информация, поскольку речь идет о MVC и DDD.

http://blog.scottbellware.com/2010/06/no-domain-driven-design-in-rails.html

1 голос
/ 13 июня 2010

Простое решение с использованием сервиса и коллекции:

<?php
class MyController {
    public function index() {
        $postService = ServiceContainer::get('Post');
        $postCollection = $postService->findAllByDateRange('within 30 days');
        while($postCollection->getNext()) {
            echo $postCollection->current()->getAuthor();
        }
    }
}

РЕДАКТИРОВАТЬ: Модель (класс) представляет собой простое представление схемы объекта.Модель (объект) представляет собой единый объект.Сервис работает на моделях и предоставляет конкретные данные контроллеру s .Ни у одного контроллера нет модели.Модели стоят отдельно.
С другой стороны, картографы отображают модели на уровни персистентности (например: базы данных, сторонние серверные части и т. Д.).

...