3

我构建了一个 MVC 应用程序,其模型层包含实体、数据映射器和服务类。到现在为止还挺好。但是现在我有一个控制器需要显示一个包含来自多个数据库表的数据的报告,这些数据与我的模型中的任何实体都没有关系。该报告是根据包含连接 SUM/AVG-selects 的高级 MySQL 查询构建的。我想要的只是一个数据数组,所以要显示在视图中。

  1. 我可以在我的服务层中混合方法,一些返回实体(“getById()”)和一些只从我的数据库查询返回数据数组(“getAdvancedReport()”)?

  2. 可以将 db-queries 放在服务层吗?如果没有,他们应该去哪里?数据映射器感觉不对,因为它的工作只是将我的实体映射到数据库,而不是检索自定义数据。

也许只是“编码官僚主义”,但我需要正确地做到这一点。

除了域模型的简单 CRUD 示例之外,在网上找不到任何东西。

4

3 回答 3

4

不是一个真正的答案..更像是一瓶啤酒

您似乎对拥有数据映射器的意义甚至对一般的域对象感到有些困惑。

数据映射器负责存储(有时是 SQL 数据库)和域对象之间的信息交换。如果你有一点标准化的数据库结构,数据库实体和域对象将不会 1:1 映射。映射器是为特定的域对象制作的,而不是为数据库表制作的。单个域对象甚至可以有多个映射器(例如:一个在 DB 中存储数据的映射器,一个在会话中存储数据的映射器)。

如果您的Report对象没有域逻辑,您甚至可以使用活动记录。实用的方法是在潜在的域对象只有CRUD 而没有域逻辑时使用它们。如果有一些计算,请坚持使用域对象 + 数据映射器对。

服务层用于应用逻辑,而不是存储逻辑。里面不应该有SQL。服务应该主要管理未确定的域对象组合和映射器之间的交互。邮寄服务和类似结构除外。

此外,通常在线报告是动态的。您可以对数据进行排序、过滤和其他操作。您最终会得到一项服务,该服务可以操纵Report对象、对其应用过滤器或从所述对象中提取数据。所有这些修补都是“应用程序逻辑”。

就是这样......我的啤酒用完了

于 2012-11-27T10:51:18.790 回答
2

我可以在我的服务层中混合方法,一些返回实体(“getById()”)和一些只从我的数据库查询返回数据数组(“getAdvancedReport()”)?

是的,但我会更正你的句子:一些返回实体,一些只返回数据数组

=> 服务的用户不关心实体/数据来自哪里。所以,是的,您的服务可以返回实体原始数据(原始类型数组)。

可以将 db-queries 放在服务层吗?

如果没有,他们应该去哪里?

在存储库/DAO 中。可以在存储库中执行本机查询。并且这里没有使用 Data Mappers,只是因为我们不需要映射实体。

总结一下:

服务->getMyData() > 存储库->getMyData() > 数据库查询

于 2012-11-27T10:59:25.797 回答
0

可以将 db-queries 放在服务层吗?如果没有,他们应该去哪里?

数据库查询应始终放在data-mapper中,因为“服务”不应该知道数据来自哪里。

于 2012-11-27T10:10:16.743 回答