我有一个用户域对象类和一个UserDAO类。用户只关心它的状态,而UserDAO只关心数据存储。从我所读过的内容来看,他们不应该彼此了解也不关心。
然后我想知道如何使用User类来处理UserDAO,反之亦然。经过一些研究后,我发现了服务类,他们应该将一堆相关的类连在一起,以便在我的情况下用户和UserDAO进行交互。
如果DAO不应该知道或不关心域对象,为什么我看到一些DAO接受相应的域对象作为参数甚至返回它?
class UserDAO
{
//other logic
public function fetchById($id)
{
//user fetch logic
return new User(...);
}
public function persist(User $user)
{
//user persist logic
}
//other logic
}
处理此问题的正确方法是什么?有了上面这个UserDAO清楚地意识到用户。
答案 0 :(得分:3)
这里有点混乱......
在DDD上下文中,Reposity模式比DAO对象更适合。您可以检查Repository和DAO here之间的区别。
存储库确实知道您的域对象,但您的域对象不了解存储库。这样做的原因是关注点分离和良好的分层。
存储库通常在某些应用程序级别注入。应用程序级别类的示例是处理用户请求的类,如控制器(mvc上下文)或Web服务。
还可以在域服务中注入存储库,但域服务通常用于解决重要业务操作或不属于域上下文中的唯一实体的操作的问题。