保持DAO和域对象的分离


Keeping DAO and domain object separate

我有一个User域对象类和一个UserDAO类。User只关心它的状态,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清楚地知道User.

这里有点混乱…

在DDD上下文中,repository模式比DAO对象更适合。您可以在这里查看Repository和DAO之间的区别。

存储库有关于你的域对象的知识,但是你的域对象不知道存储库。这样做的原因是关注点的分离和良好的分层。

储存库通常被注入到一些应用程序级别的类中。应用级类的例子是处理用户请求的类,如控制器(mvc上下文)或web服务。

也可以在域服务中注入存储库,但域服务通常用于解决重要业务操作的问题,或者用于解决不属于域上下文中唯一实体的操作。