我有一个包含这些项目的n层解决方案(针对此问题进行了简化):
在"域"项目我有一个"存储库"命名空间和每个存储库映射到数据库中的不同表并查询其数据。
例如,表Customers
和Orders
将包含相应的存储库 - CustomersRepository
和OrdersRepository
。
在Logic
项目中,我实例化这些存储库对象并调用实际查询数据库的方法。
假设我想显示一个显示两个表中某些数据的报告。
此报告由一组自定义对象构建 - IList<ReportObject>
。
现在,这个ReportObject
对象在数据库中没有对应的表,因此没有存储库对象。
我的问题:我应该在哪里放置实际查询数据库并获取IList<ReportObject>
的部分代码?它应该只在Logic
层的某个数据控制器中吗?或者为报告创建另一个存储库?还有其他选择吗?
答案 0 :(得分:1)
虽然我认为这主要是一个意见问题,但请注意:
您可以创建QueryStore<ReportObject>
而不是Repository<ReportObject>
。 QueryStore这个名字就是我想出来的,它不是一个创造性的术语。
这样的查询存储的功能是对任何存储库未涵盖的数据运行查询。它只包含查询,因此,例如,可以使用LINQ在实体框架上查询数据库VIEW轻松实现。
答案 1 :(得分:1)
存储库模式用于封装CRUD操作,但在您的情况下,您不需要任何插入或更新。我会将它放入逻辑层并直接从那里访问数据库。
答案 2 :(得分:1)
我将它放在自定义存储库中(因为这不是CRUD操作)。您可以扩展Repository(如果您正在使用通用存储库)并为查询创建一个。我不会把查询放在其他地方而不是存储库中,因为你会扼杀Repository所做的事情。想象一下,您将来更改数据库,它不足以更改存储库层。没有把它放在那里的另一个原因是逻辑将遍布应用程序,而不是只在一个地方的所有东西,这简化了查询的调试和改进。
希望它有所帮助。吉列尔莫。