Entity Framework 中没有存储库模式的存储过程
Stored Procedures in Entity Framework without Repository Pattern
我有点混淆存储库模式和 Entity Framework。
在 this answer 中,我了解到,由于以下原因,在 Entity Framework 之上创建存储库是不好的:
- EF 实现
UnitOfWork
- EF 实现通用存储库
Repository
模式用于将数据库从业务逻辑中抽象出来,Entity Framework 做到了
我们不应在 EF 之上创建存储库,而应使用服务。
现在的问题:
如果我出于性能原因决定将某些 Linq 查询替换为存储过程调用,如 mentioned here,那会怎样?这个答案建议使用某种存储库模式。
感觉很脏,如果直接在服务层调用存储过程,数据库就不再抽象出业务逻辑了。
如何抽象存储过程调用?还是可以,从Service层调用?
在 EF 之上有一个 repo 不好的原因是,在许多情况下,开发人员还暴露了 IQueryable
,这违背了模式的目的。您当然可以拥有一个使用 EF 作为 内部实现 细节的存储库(顺便说一句,这是一项服务)。
Repository 和 EF 之间的关系是 Repository 可能使用 EF,但客户端(使用 repo)不应该意识到这一点。 EF 不是 一个存储库,虽然它可以用作一个存储库,但它是开发人员忽略这一点的另一种情况。
在 CRUD 应用程序中直接使用 EF 是可以的,不用假装你在使用 Repository 模式,那些应用程序并不真正需要它。
在您的情况下,存储库实现应该允许您根据自己的意愿进行更改,因为界面不应该受到影响;这就是存储库接口仅适用于业务模型定义的业务对象的原因。
在适当的体系结构中,您不会执行 linq 或直接调用 SProcs,因为这些是持久层细节。该应用程序的其余部分不知道它们。您可以让存储库、查询服务等(作为接口)与调用层已知的概念(业务对象、视图模型、读取模型)一起工作,并且只有这些服务的实现知道 EF 或 SPRocs。
我有点混淆存储库模式和 Entity Framework。
在 this answer 中,我了解到,由于以下原因,在 Entity Framework 之上创建存储库是不好的:
- EF 实现
UnitOfWork
- EF 实现通用存储库
Repository
模式用于将数据库从业务逻辑中抽象出来,Entity Framework 做到了
我们不应在 EF 之上创建存储库,而应使用服务。
现在的问题:
如果我出于性能原因决定将某些 Linq 查询替换为存储过程调用,如 mentioned here,那会怎样?这个答案建议使用某种存储库模式。
感觉很脏,如果直接在服务层调用存储过程,数据库就不再抽象出业务逻辑了。
如何抽象存储过程调用?还是可以,从Service层调用?
在 EF 之上有一个 repo 不好的原因是,在许多情况下,开发人员还暴露了 IQueryable
,这违背了模式的目的。您当然可以拥有一个使用 EF 作为 内部实现 细节的存储库(顺便说一句,这是一项服务)。
Repository 和 EF 之间的关系是 Repository 可能使用 EF,但客户端(使用 repo)不应该意识到这一点。 EF 不是 一个存储库,虽然它可以用作一个存储库,但它是开发人员忽略这一点的另一种情况。
在 CRUD 应用程序中直接使用 EF 是可以的,不用假装你在使用 Repository 模式,那些应用程序并不真正需要它。
在您的情况下,存储库实现应该允许您根据自己的意愿进行更改,因为界面不应该受到影响;这就是存储库接口仅适用于业务模型定义的业务对象的原因。
在适当的体系结构中,您不会执行 linq 或直接调用 SProcs,因为这些是持久层细节。该应用程序的其余部分不知道它们。您可以让存储库、查询服务等(作为接口)与调用层已知的概念(业务对象、视图模型、读取模型)一起工作,并且只有这些服务的实现知道 EF 或 SPRocs。