在哪里放置返回自定义对象的复杂查询?

时间:2014-08-28 12:28:03

标签: asp.net-mvc entity-framework architecture n-tier-architecture

我有一个包含这些项目的n层解决方案(针对此问题进行了简化):

  1. 逻辑
  2. 网络
  3. 在"域"项目我有一个"存储库"命名空间和每个存储库映射到数据库中的不同表并查询其数据。 例如,表CustomersOrders将包含相应的存储库 - CustomersRepositoryOrdersRepository

    Logic项目中,我实例化这些存储库对象并调用实际查询数据库的方法。

    假设我想显示一个显示两个表中某些数据的报告。 此报告由一组自定义对象构建 - IList<ReportObject>

    现在,这个ReportObject对象在数据库中没有对应的表,因此没有存储库对象。

    我的问题:我应该在哪里放置实际查询数据库并获取IList<ReportObject>的部分代码?它应该只在Logic层的某个数据控制器中吗?或者为报告创建另一个存储库?还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

虽然我认为这主要是一个意见问题,但请注意:

您可以创建QueryStore<ReportObject>而不是Repository<ReportObject>。 QueryStore这个名字就是我想出来的,它不是一个创造性的术语。

这样的查询存储的功能是对任何存储库未涵盖的数据运行查询。它只包含查询,因此,例如,可以使用LINQ在实体框架上查询数据库VIEW轻松实现。

答案 1 :(得分:1)

存储库模式用于封装CRUD操作,但在您的情况下,您不需要任何插入或更新。我会将它放入逻辑层并直接从那里访问数据库。

答案 2 :(得分:1)

我将它放在自定义存储库中(因为这不是CRUD操作)。您可以扩展Repository(如果您正在使用通用存储库)并为查询创建一个。我不会把查询放在其他地方而不是存储库中,因为你会扼杀Repository所做的事情。想象一下,您将来更改数据库,它不足以更改存储库层。没有把它放在那里的另一个原因是逻辑将遍布应用程序,而不是只在一个地方的所有东西,这简化了查询的调试和改进。

希望它有所帮助。吉列尔莫。