将 DAO 和域对象分开

Posted

技术标签:

【中文标题】将 DAO 和域对象分开【英文标题】:Keeping DAO and domain object separate 【发布时间】:2014-08-17 21:58:58 【问题描述】:

我有一个 User 域对象类和一个 UserDAO 类。 User 只关心它的状态,而 UserDAO 只关心数据的存储。从我所读到的,他们应该不知道也不关心彼此。

然后我想知道如何使用我的 User 类与 UserDAO 一起做事,反之亦然。经过一些研究,我发现了 Service 类,在我的例子中,它们应该将一堆相关的类耦合在一起用于交互 User 和 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。

【问题讨论】:

【参考方案1】:

这里有点混乱......

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

存储库确实了解您的域对象,但您的域对象不了解存储库。这样做的原因是关注点分离和良好的分层。

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

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

【讨论】:

根据我的阅读,我了解到存储库可以使用 DAO,但反之则不行。

以上是关于将 DAO 和域对象分开的主要内容,如果未能解决你的问题,请参考以下文章

数据库和域模型之间的对象关系映射

DAO模式

JSP 内置对象和域

DAO模式

CQRS 命令和域状态

spring mvc中的单元测试