【问题标题】:Where to put complex query that returns a custom object?将返回自定义对象的复杂查询放在哪里?
【发布时间】:2014-08-28 20:44:18
【问题描述】:

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

  1. 逻辑
  2. 网络

在“域”项目中,我有一个“存储库”命名空间,每个存储库都映射到数据库中的不同表并查询其数据。 例如 - 表 CustomersOrders 将具有相应的存储库 - CustomersRepositoryOrdersRepository

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    您可以创建QueryStore<ReportObject>,而不是Repository<ReportObject>。 QueryStore 这个名字只是我想出来的,不是一个新词。

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

    【讨论】:

      【解决方案2】:

      我会将它放在自定义存储库中(因为这不是 CRUD 操作)。您可以扩展存储库(如果您使用的是通用存储库)并为查询创建一个。我不会将查询放在其他地方而不是存储库,因为您会破坏存储库所做的封装。想象一下,您将来更改数据库,仅更改存储库层是不够的。不把它放在那里的另一个原因是逻辑将分散在应用程序周围,而不是把所有东西都放在一个地方,这简化了查询的调试和改进。

      希望对您有所帮助。吉列尔莫。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-02
          • 1970-01-01
          • 2021-12-18
          • 1970-01-01
          • 1970-01-01
          • 2011-08-14
          • 2018-09-15
          相关资源
          最近更新 更多