【发布时间】:2022-02-12 23:17:03
【问题描述】:
我有一个使用 Entity Framework 的应用程序,我有一个名为 BaseRepository<T> 的类,其中包含一些基本的 CRUD 方法,例如(Get、GetAll、Update、Delete、Insert),并从这个类中生成我的特定存储库,例如BaseRepository <Products>、BaseRepository<People>、BaseRepository<Countries> 等等。
问题是,当我在服务中有一个复杂的逻辑时,它涉及连接多个表并且不返回实体,而是在服务中处理的对象(它既不是数据库实体,也不是一个 DTO),我发现存储库仅对基本的 CRUD 操作没有多大帮助。
我应该把这个复杂的查询放在哪里?它应该在哪个存储库中?如何加入这些存储库?问题是我看到存储库处理单个实体,在这种情况下我该怎么办?我一直在做一些研究,发现返回 IQueryable<T> 是不好的做法,所以我排除了发送 IQueryable<T> 的可能性,我将加入该服务并在那里执行。
我进行了研究,但没有找到明确的答案。我想知道这些复杂查询的组织方式和位置,因为我还想尊重每个存储库及其各自实体的责任。
【问题讨论】:
-
简短回答:不在通用存储库(反)模式中。对于长答案,请参阅我对这个问题的回答:stackoverflow.com/questions/70760405/…
-
存储库只不过是一个数据库表,作为具有列表语义的对象公开给对象模型。正如
DbSet已经做得足够了。 -
“我一直在做一些研究,发现返回 IQueryable
是不好的做法” 不。就是这样,你刚刚发现了原因。让数据消费者请求它想要的任何形状。
标签: c# entity-framework design-patterns architecture repository-pattern