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