Asp.net mvc 存储库模式-如何正确处理连接和复杂查询?
我对存储库模式有一个问题——如何在多个存储库之间执行连接操作。在这个项目中,我们使用MVC、EF、DDD。我知道这类问题在这里已经出现过好几次了,我在这一次后面会提到这些问题Asp.net mvc 存储库模式-如何正确处理连接和复杂查询?,asp.net-mvc,entity-framework,design-patterns,domain-driven-design,repository-pattern,Asp.net Mvc,Entity Framework,Design Patterns,Domain Driven Design,Repository Pattern,我对存储库模式有一个问题——如何在多个存储库之间执行连接操作。在这个项目中,我们使用MVC、EF、DDD。我知道这类问题在这里已经出现过好几次了,我在这一次后面会提到这些问题 在通用知识库模型(iRealStand)和特定的存储库模型之间,我选择了特定的选项,因为我认为ORM(在我们的例子中是EF)本身是一个通用的存储库模式,所以添加另一个通用库是没有意义的,我们宁愿将知识库定制成域需求。 问题是我有几个(~10)个表,每个表都有许多行(数百万),我需要执行连接,因此使用IList或IEnume
在通用知识库模型(iRealStand)和特定的存储库模型之间,我选择了特定的选项,因为我认为ORM(在我们的例子中是EF)本身是一个通用的存储库模式,所以添加另一个通用库是没有意义的,我们宁愿将知识库定制成域需求。 问题是我有几个(~10)个表,每个表都有许多行(数百万),我需要执行连接,因此使用IList或IEnumerable是不可行的选择
我的理解(以及我的观点)是IQueryable不应该离开存储库(“DAL中发生的事情应该留在DAL中”)。公开IQueryable并在LINQIn服务中使用它会简单得多,但它严重违反了关注点分离并破坏了存储库的作用——在这种情况下,服务将和存储库做同样的事情。以下几篇文章支持这一观点(或者更确切地说是信念): 也有类似的问题和解决方案,例如,建议.Include(),但这不是重载表和跨多个表的联接的选项-对于每个联接,我们使用子选择来限制实际联接的内容) 这个问题(答案和评论)——基本上建议了基于任务的区别:为带有连接的查询创建一个存储库,并为每个实体的操作创建“常规”存储库 我看到我们有以下选择:还有一件事。实体:回购不存在1:1匹配。只有聚合应该有一个存储库,而不是每个实体。存储库的处理要点是将数据库全部忽略。数据库引擎、表、sql、连接等是存储库的实现细节,它们永远不会超过持久性边界。因此,应用程序从不知道EF或JOIN,也从不直接访问数据库。该应用程序只知道存储库,它告诉它做什么/得到什么,而不告诉它如何做I I Robert,我正在努力解决同样的问题。到目前为止,我的发现让我得出了与你的选择相同的结论。您最终会选择哪种方法?为什么?您好,对于复杂查询,我们只使用一些特定的存储库进行查询,在我们的例子中,这些存储库中的查询通常由存储过程执行,这些存储过程返回多个记录集(当联接不够时),存储库将其转换为特定的(通常是复杂的)域对象(它本身不是实体,但我相信它仍然不是DDD的滥用)?例如GetOrderLineByOrderId或GetOrderLineByCustomerId对于标准查询,我们在聚合根和EF6周围使用普通存储库,在前面提到的情况下,它类似于处理订单域的OrderRepository。