与数据库交互的函数的最佳做法
假设我有一个User
对象,它由Usermapper
生成。 User
对象不知道任何关于正在使用的数据库/存储库(我认为这是一个好的设计)。与数据库交互的函数的最佳做法
当创建User
时,我只想让它由映射器填充最平凡的东西,例如,名称,地址等。然而,在对象实例化之后,我可能有一个方法userX.getTotalDebt()
,getTotalDebt()
需要重新连接到数据库,因为我不希望为每个用户实例化(需要多个表等)完成相对昂贵的操作。如果我只是在getTotalDebt()
中插入一些sql,或者依赖项返回到Mapper
,那么耦合度非常快地增长。
有一个明显的好的/最好的做法,因为这是一种情况经常出现,但我找不到,或者我从一个错误的角度看这个问题。
说我有一个User对象,它由Usermapper生成。 User对象并不知道任何关于正在使用的数据库/存储库(我认为这是一个好的设计)。
它们通常被称为POCO(Plain Old CLR Objects)。
当创建一个用户时,我只希望它用最平凡的东西来填充映射器,名称,地址等
有几个OR/M层可以实现这一点。使用nhibernate或实体框架4.1代码优先。
我可能有一个方法userX.getTotalDebt(),getTotalDebt()将需要重新连接到数据库
那就不是一个波苏了。尽管可以使用透明代理。 EF和nhibernate都支持这个,它被称为延迟加载。
有这个明显好/最好的做法,因为这是一个情况出现的时候,然而我不能找到它,否则我从错误的角度完全看这个问题
我通常保持我的对象愚蠢和断开连接。我使用Repository模式(即使我使用nhibernate或其他orm),因为它使我的类可测试。
我要么直接使用存储库类,要么创建一个包含所有逻辑的服务类。这取决于我的应用程序有多复杂。
然后你/ ORM会在哪里实现getTotalDebt()方法的功能?在Mapper的瞬间,具体地说 - 通过在数据库中加入更多的表格?因为我在您不喜欢透明代理/延迟加载方法的行之间阅读。 – hbogert 2011-12-15 14:22:27