2013-08-27 4 views
3

Я пытаюсь эффективно работать с DDD и Doctrine2 по проекту с большим количеством бизнес-логики.DDD, Doctrine2, Aggregates и ArrayCollection: как изолировать модель домена?

Это довольно ново для меня, я читаю много статей и примеров кода, чтобы понять основные принципы и методы DDD.

Я понимаю, что нам нужно отвязать домен объекты из других понятий, связанных с системой, т.е. в многоуровневой архитектуре, «домен слой» должен быть изолировать от других слоев, как сохранение слоя/услуги (Doctrine2 для меня).

Но есть одна вещь, которую трудно понять, для меня: в нескольких примерах кода ДДД с doctrine2, агрегаты в предприятия области управляются с Doctrine ArrayCollection, я нашел такой код:

namespace Acme\Domain\Model\Users; 

use Doctrine\Common\Collections\ArrayCollection; 

class User{ 

    //... 

    /** 
    * Collection of Roles 
    * 
    * @var Collection of Roles 
    */ 
    protected $roles; 

    /** 
    * Constructor. 
    */ 
    public function __construct() 
    { 
     $this->createdAt = new \DateTime(); 
     $this->roles = new ArrayCollection(); 
    } 

    public function getRoles() 
    {   
     return $this->roles; 
    } 
//... 
} 

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

С другой стороны, если классы DDD Entity и Doctrine Entity разделены, то, по моему мнению, для многих слоев/классов существует. Как вы думаете? Есть ли лучший способ избежать этого?

+0

Вы упомянули «много бизнес-логики». Подумайте о том, чтобы начать новый вопрос, посвященный только одному бизнес-правилу, которое, по вашему мнению, может принести пользу от DDD. – Cerad

ответ

4

Не волнуйтесь при использовании ArrayCollections. Обратите внимание, что в пространстве имен Doctrine/Common. Это всего лишь небольшая оболочка массива утилиты без особых связей с уровнем упорства Doctrine. Вы можете легко заменить его другим классом класса.

Руководство направляет эту проблему: http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#collections. Прокрутите вниз до: 5.12. Коллекции

Что касается развязки, то можно сделать DDD-моделирование, ограничив себя сущностями доктрины. Это очень ограничивает и вообще обескураживает. Так что, да, вам, вероятно, понадобится еще один слой.

Трудно оправдать накладные расходы чистой реализации DDD в php.

+0

Можете ли вы посоветовать некоторые конкретные примеры того, что ограничивает возможности Doctrine Entities с точки зрения DDD-моделирования и почему это обескураживает? Также немного подгоните, как бы вы использовали «другой слой»? Благодарю. –

+1

Нет объектов ценности. Нет вложенных объектов. Это обескураживает, потому что вы должны проектировать свою модель домена, не беспокоясь о том, как она будет сохраняться. Другой уровень означает вставку своего рода сервиса, который перенесет объекты модели домена в объекты доктрины и наоборот. В принципе, другой процесс сопоставления. – Cerad

+0

Эта статья: http://williamdurand.fr/2013/08/20/ddd-with-symfony2-making-things-clear/ - не очень удачная попытка решить некоторые из этих проблем. – Cerad

Смежные вопросы