MVC 中的单个 DAO 还是多个 DAO?

Posted

技术标签:

【中文标题】MVC 中的单个 DAO 还是多个 DAO?【英文标题】:Single DAO or multiple DAOs in MVC? 【发布时间】:2013-07-22 20:55:13 【问题描述】:

在一对多的数据库映射场景中,假设一个部门可以有多个员工,那么设计 DAO 层的最佳实践是什么?

我应该使用一个通用 DAO 类来获取/设置部门对象和获取/设置员工对象,还是应该使用两个单独的 DAO 类 DepartmentDAO 和 EmployeeDAO 来分别获取/设置部门对象和员工对象?

【问题讨论】:

【参考方案1】:

我会用一个 dao 来区分 Department 和另一个 Employee 。我认为红旗是:你会怎么称呼合道?

如果您没有立即想到一个清晰直观的名称,则可能是代码异味。如果这个名字没有跳出来,它肯定会让其他看你代码的程序员感到困惑。为什么要把两个截然不同的东西粘在一起?

一些准则:

    例如,如果是 Employee 和 Contractor,我可能会更相信将它们组合成一个泛型,但即便如此,我还是有可能将它们分开,除非我有充分的理由不这样做将它们分开。

    如果您的项目开始变得庞大,有 15 或 20 个 DAO,您最终可能会决定使用一个 DAO,但这是您可以在下游做出的决定。然后也许你可以创建一个 HumanResources DAO 或类似的东西。这主要是为了防止布线过多。

将部门和员工分开几乎没有什么缺点,而且在代码的清晰度和易于维护方面可能会有一些显着的收益。如果您有充分的理由,将来将它们结合起来并不难。

这是我的看法。

【讨论】:

如果这两个类没有关系,使用两个独立的 DAO 是很明显的。我正在使用 Hibernate 进行 java 类到数据库表的映射,它具有一对多的关系,所以我想知道将两个 DAO 组合在一起是否有任何优势。【参考方案2】:

实际上,在我看来,您至少需要 3 个不同的 DAO:

DepartmentDAO EmployeeDAO EmployeeCollectionDAO

事情是 - 单个实体的映射和实体组的映射具有显着差异。因此,它们应该由不同的结构来处理,否则你有违反SRP的风险。

另外,Department 应该与 Employee 实例的集合进行交互,而不是单独与每个实例交互。

【讨论】:

以上是关于MVC 中的单个 DAO 还是多个 DAO?的主要内容,如果未能解决你的问题,请参考以下文章

一个大 DAO 还是多个较小的 DAO?

每个“容器”类一个 DAO 还是每个表一个 DAO?

DAO 模式 - 它提供业务对象还是纯数据?

在 Dao 类中使用静态方法还是非静态方法?

在 Spring 中将多个存储库自动装配到单个 DAO 中 - 不好的做法?

数据访问对象 (DAO) 中的方法应该抛出还是捕获其异常? [关闭]