Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 我应该在DAO中传入或封装连接吗?_Language Agnostic_Persistence_Encapsulation_Dao - Fatal编程技术网

Language agnostic 我应该在DAO中传入或封装连接吗?

Language agnostic 我应该在DAO中传入或封装连接吗?,language-agnostic,persistence,encapsulation,dao,Language Agnostic,Persistence,Encapsulation,Dao,将连接封装在DAO中是更好的做法,即让DAO创建或检索连接,然后关闭,还是将连接传递到DAO并在DAO外部的代码中处理细节更好 跟进:如果将连接封装在DAO中,如何管理关闭的连接?DAO应该执行CRUD操作并对调用方隐藏这些操作。因此,您应该封装连接 另一方面,如果上级正在协调DAO(例如事务),那么您也可以将连接传递到DAO(并在打开连接的同一级别关闭连接,而不是在DAO中) 底线是。。。这实际上取决于应用程序的每一层所承担的责任。调用方是否应该关心DAO在哪里检索数据?如果没有,则封装连接。

将连接封装在DAO中是更好的做法,即让DAO创建或检索连接,然后关闭,还是将连接传递到DAO并在DAO外部的代码中处理细节更好


跟进:如果将连接封装在DAO中,如何管理关闭的连接?

DAO应该执行CRUD操作并对调用方隐藏这些操作。因此,您应该封装连接

另一方面,如果上级正在协调DAO(例如事务),那么您也可以将连接传递到DAO(并在打开连接的同一级别关闭连接,而不是在DAO中)


底线是。。。这实际上取决于应用程序的每一层所承担的责任。调用方是否应该关心DAO在哪里检索数据?如果没有,则封装连接。

从纯可用性和标准的角度来看,我认为您希望DAO处理连接。这毕竟是数据访问的一个主要功能

考虑一下您的使用,您是否希望使用DAO的表示层/业务层代码对数据库有足够的了解,从而创建一个要传递给DAO的连接?如果需要移动数据库或对其重新命名,此时封装连接非常好


使用管理自身连接的DAO还可以更简洁地使用调用代码中的对象,提高整体可读性。我想您已经回答了自己的问题。基本设计模式解释了DAO应该创建/检索连接(比如通过工厂),并对任何调用方(如服务层类)隐藏这些连接


您认为保持这种外部性有什么好处吗?

我认为DAO的关键点是,您可以在应用程序的其余部分不知道或不关心的情况下交换实现。实际上我在一个项目上做过这个。DAO接口保持不变,但连接细节会发生变化,因此您无法在外部看到它。

我正在考虑创建一个工厂,让DAO调用它,这本质上是封装。DAO工厂用于生成具体的DAO(实现)。我不确定我是否理解你所说的“创建一个工厂并让DAO称之为”是什么意思!对不起,我指的是连接工厂,不是DAO工厂。