Entity Framework 中没有存储库模式的存储过程

Stored Procedures in Entity Framework without Repository Pattern

我有点混淆存储库模式和 Entity Framework。

this answer 中,我了解到,由于以下原因,在 Entity Framework 之上创建存储库是不好的:

我们不应在 EF 之上创建存储库,而应使用服务。

现在的问题:

如果我出于性能原因决定将某些 Linq 查询替换为存储过程调用,如 mentioned here,那会怎样?这个答案建议使用某种存储库模式。

感觉很脏,如果直接在服务层调用存储过程,数据库就不再抽象出业务逻辑了。

如何抽象存储过程调用?还是可以,从Service层调用?

在 EF 之上有一个 repo 不好的原因是,在许多情况下,开发人员还暴露了 IQueryable,这违背了模式的目的。您当然可以拥有一个使用 EF 作为 内部实现 细节的存储库(顺便说一句,这是一项服务)。

Repository 和 EF 之间的关系是 Repository 可能使用 EF,但客户端(使用 repo)不应该意识到这一点。 EF 不是 一个存储库,虽然它可以用作一个存储库,但它是开发人员忽略这一点的另一种情况。

在 CRUD 应用程序中直接使用 EF 是可以的,不用假装你在使用 Repository 模式,那些应用程序并不真正需要它。

在您的情况下,存储库实现应该允许您根据自己的意愿进行更改,因为界面不应该受到影响;这就是存储库接口仅适用于业务模型定义的业务对象的原因。

在适当的体系结构中,您不会执行 linq 或直接调用 SProcs,因为这些是持久层细节。该应用程序的其余部分不知道它们。您可以让存储库、查询服务等(作为接口)与调用层已知的概念(业务对象、视图模型、读取模型)一起工作,并且只有这些服务的实现知道 EF 或 SPRocs。