2013-08-27 71 views
3

我正在尝试与DDDDoctrine2有效地合作,这个项目有很多业务逻辑。DDD,Doctrine2,Aggregates和ArrayCollection:如何隔离域模型?

这对我来说很新颖,我读了很多文章和代码示例来了解DDD的主要原理和实践。

我明白我们需要去耦域从与系统中的其它概念对象, 即,在分层体系结构“的域层”必须是从其它层隔离,如持久层/服务(Doctrine2为了我)。

但有一两件事,很难理解我:在doctrine2 DDD的几个代码示例,聚集域实体与学说的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建模,同时限制自己的原则实体。这是非常有限的,通常不鼓励。所以是的,你可能会需要另一层。

很难证明在PHP中使用纯DDD实现的开销。

+0

你能否提供一些具体的例子来说明从DDD建模角度限制学说实体的原因以及为什么它不受鼓励?也草拟了一下你将如何使用“另一层”?谢谢。 –

+1

没有值对象。没有嵌套对象。不鼓励它,因为你应该设计你的领域模型,而不必担心它将如何被持久化。另一层意味着插入某种服务,将您的域模型对象转换为教义实体,反之亦然。基本上,另一个映射过程。 – Cerad

+0

本文:http://williamdurand.fr/2013/08/20/ddd-with-symfony2-making-things-clear/对于解决这些问题并不是很成功。 – Cerad