我正试图在一个具有大量业务逻辑的项目上有效地使用、DDD、和Doctrine2。
我理解--我们需要将域对象与与系统相关的其他概念解耦,即在分层体系结构中,“域层”必须与其他层分离,比如持久化层/服务(Doctrine2 )。
但有一件事我很难理解:在一些使用Doctrine 2的DDD代码示例中,域实体中的聚合是用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实体和Doctrine实体类是解耦的,那么在我看来,有很多层/类。
你认为如何?有更好的方法来避免/处理这件事吗?
发布于 2013-08-27 20:05:12
不要对ArrayCollections的使用感到惊慌。注意,它位于Doctrine/ Notice命名空间中。它只是一个小小的实用程序数组包装器,与Doctrine持久化层没有特殊的联系。您可以轻松地用另一个数组类替换它。
就解耦而言,可以进行DDD建模,同时将自己限制在理论实体上。这是非常有限的,通常是气馁的。所以是的,你可能需要另一层。
在PHP中很难证明纯DDD实现的开销是合理的。
https://stackoverflow.com/questions/18460343
复制相似问题