Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Oop 与数据库交互的函数的最佳实践_Oop_Design Patterns - Fatal编程技术网

Oop 与数据库交互的函数的最佳实践

Oop 与数据库交互的函数的最佳实践,oop,design-patterns,Oop,Design Patterns,假设我有一个User对象,它是由Usermapper生成的。User对象对正在使用的数据库/存储库一无所知(我认为这是一个很好的设计) 在创建用户时,我只希望映射程序用最琐碎的东西来填充它,例如名称、地址等。但是,在对象实例化之后,我可能会有一个方法userX.getTotaleBT(),getTotaleBT(),需要重新连接到数据库,因为我不希望对每个用户实例化(需要多个表等)都执行这个相对昂贵的操作。如果我只是简单地在gettotalebt()中插入一些sql,或者将一个依赖项返回到Map

假设我有一个
User
对象,它是由
Usermapper
生成的。
User
对象对正在使用的数据库/存储库一无所知(我认为这是一个很好的设计)

在创建
用户时
,我只希望映射程序用最琐碎的东西来填充它,例如名称、地址等。但是,在对象实例化之后,我可能会有一个方法
userX.getTotaleBT()
getTotaleBT()
,需要重新连接到数据库,因为我不希望对每个用户实例化(需要多个表等)都执行这个相对昂贵的操作。如果我只是简单地在
gettotalebt()
中插入一些sql,或者将一个依赖项返回到
Mapper
中,在那里,耦合变得非常紧密

这方面有一个明显的良好/最佳实践,因为这是一个经常出现的情况,但是我找不到它,或者我从一个错误的角度看待这个问题

假设我有一个用户对象,它是由Usermapper生成的。用户对象对正在使用的数据库/存储库一无所知(我认为这是一个很好的设计)

它们通常被称为POCOs(普通的旧CLR对象)

当创建一个用户时,我只希望映射程序用最琐碎的东西来填充它,例如名称、地址等

有几个OR/M层可以实现这一点。首先使用nhibernate或Entity Framework 4.1代码

我可能有一个方法userX.gettotalebt(),gettotalebt()需要重新连接到数据库

那就不再是poco了。尽管可以使用透明代理。EF和nhibernate都支持这一点,称之为延迟加载

这方面有一个明显的良好/最佳实践,因为这是一个经常出现的情况,但是我找不到它,或者我从一个错误的角度看待这个问题

我通常让我的对象保持沉默和断开连接。我使用存储库模式(即使我使用nhibernate或其他orm),因为它使我的类可测试


我要么直接使用存储库类,要么创建一个包含所有逻辑的服务类。这取决于我的应用程序有多复杂。

那么您/ORM在哪里实现了getTotaleBt()方法的功能?具体地说,在映射器中的实例中——通过连接数据库中的更多表?因为我从字里行间读到,你也不喜欢透明代理/延迟加载方法。延迟加载将数据库异常移动到数据层之外,如果你不小心,可能会生成大量SQL查询。最好加入并返回完整的列表。感谢您迄今为止的见解。到目前为止,我对join解决方案非常满意。然而,不断地连接不同的表变得非常乏味。我已经开始使用groupby子句,这会减慢对象的创建速度。--接下来我考虑了以下问题,让控制器确定何时检索相应的信息,例如,我检索了一个用户数组。然后我可以调用趋势中的某个内容:
userDataMapper.retrieveTurnOver($users)
此方法会将User.overflower字段从null更改为实际值。从设计角度看,这有意义吗?