2009-08-18 82 views
3

我正在考虑实施领域驱动设计方法(类似于here中描述的方法),但希望将其与Doctrine ORM集成。有没有人做过这样的事情?我的初始本能就是使用Doctrine作为DAO层,但对于Doctrine来映射我的数据库字段,我的实体对象映射到Doctrine对象上的(基本上)相同的一组字段似乎有些复杂。使用领域驱动设计原则

我最初的目标是将我所有的DQL /查询逻辑从我的域实体中分离出来,但现在我在设计模式域中感觉有点迷失。

我知道Doctrine 2应该提供更友好的方法来DDD技术,但我不知道我想等那么久。我想做什么是有意义的,还是应该找到另一种方法?

谢谢。

回答

2

在我看来,由于缺乏Repository类,所以学说在DDD方面并不完美。 Doctrine支持表格数据网关和活动记录等模式,虽然对于某些问题的良好模式不一定是“经典”DDD的最佳选择。但是,您可以解决这些缺陷。

一种选择是从Doctrine_Table派生出来,并将其用作穷人的存储库。例如,如果您有一个名为“BlogPost”的类,则可能有一个继承自Doctrine_Table的表类“BlogPostTable”。然后,您可以将诸如'findByCategory'之类的方法添加到BlogPostTable类中,使这些逻辑与您的域对象(从Doctrine_Record继承)保持分离。它与'纯粹'DDD倡导的模式不完全相同,但它足够接近。

即使没有完全相同的设计模式,您仍然可以使用DDD的核心洞察力。最主要的是无处不在的语言,这个概念试图用领域专家和开发人员都能读懂的精确语言来描述你的领域。

+0

谢谢。我认为这个回应完全反映了我的经历。学说的方格钉恰好不适合DDD的圆孔。我最终将我的Doctrine_Record类视为我的实体,并使用Doctrine_Table作为DAO层实现了一个基本的Repository类。虽然它确实给了我想要的大部分分离,但它确实感觉有点笨拙,或者架构过度,因为有时存储库感觉有点多余。 – 2009-09-02 02:16:30

+0

偶然发现Google的这个答案,并认为值得注意的是,现在已经过时了,因为Doctrine2实现了数据映射器模式,实体是POPO的,因此它非常适合DDD并且非常适合SRP。 – 2015-08-20 13:08:46