ASP.net 5和EF7中是否不再需要存储库?


9

我在github上向EF团队发布了一个问题。我得到了一个答复,说最好在这里提出这个问题,所以我将其复制并粘贴到此处作为链接,以便其他人可以在GitHub上看到一些答复。

问题:我正在做一些研究,有人指出DBContext类的第24行指出

DbContext是工作单元和存储库模式的组合。

这是否意味着我们不再需要将EF抽象到存储库,然后使用and Interface将其注入Controller中?

Github上的原始帖子:https : //github.com/aspnet/EntityFramework/issues/4899

我问这个问题的原因是,我似乎进入了一个即时状态,即在存储库中添加了很多方法,例如GetById,GetByName,GetWithIncludesABC,GetWithIncludes123等。这似乎在困扰着我


1
您如何看待罗文米勒的答案?对我来说似乎完全合理。
罗伯特·哈维

@RobertHarvey是的,这是一个很好的答案,但我想看看其他人对这个主题的看法,然后再决定是否要进行存储
Loren.Dorez

另请参阅lostechies.com/jimmybogard/2009/09/11/wither-the-repository,其中Bogard提出了类似的观点
mcknz

我对为什么EF(和其他ORM)不是存储库的看法。
埃里克·金

存储库将没有GetWithIncludesABC之类的方法。存储库模式基本上是数据库表作为集合的抽象。通常,可以查询集合(例如通过LINQ),然后资源库将查询转换为SQL。您所说的听起来更像是数据网关。
Cochese先生16年

Answers:


12

如果您要向存储库中添加方法,例如

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

然后,最好转移到服务层,并让服务层直接使用EF。EF已经具有与上述方法类似的功能,您将无休止地进行复制。

服务层公开业务域方法,并使用CRUD来实现它们。例如,您可能有一个名为的方法TransferMoney(A, B),其中A和B正在检查帐户。这使您可以说出业务领域的语言,而服务层则为您处理CRUD。

我可以想到的唯一令人信服的原因是,您可能希望在哪里拥有单独的存储库层,以便您可以模拟该存储库层或替换其他数据源以进行测试。



4

罗伯特·哈维(Robert Harvey)在回答中说:

我可以想到的唯一令人信服的原因是,您可能希望在哪里拥有单独的存储库层,以便您可以模拟该存储库层或替换其他数据源以进行测试。

这就是为什么存储库模式仍然重要的原因。我也不同意实体框架团队关于实现存储库模式的主张。实体框架仍然非常依赖于数据库。存储库模式的整个目的是将应用程序中使用的确切持久性机制解耦和抽象化,以使数据访问实现中的任何内容都不会泄漏到存储库层之外。

如果您在“存储库”之外使用EF查询API,例如在某种服务对象中使用,我会说您正在破坏模式。

现在,如果泄漏到其他代码中的数据库之类的功能不是灾难性的问题,并且可以保证将来不需要将某些CRUD操作移至Web服务,那么直接使用EF就可以了。好。

基本上,实体框架在存储库模式中代替了网关对象。我不将其视为存储库本身。


存储库与服务层方面有何不同?从我可以发现如果我返回IQueryable然后本质上是一个存储库,如果我返回IEnumerable然后我使用服务层。它是否正确?服务层和存储库模式是否相似?
Loren.Dorez '16

@ Loren.Dorez:服务层具有特定于业务域的方法,例如TransferFunds()BuildWidget()。存储库仅包含CRUD方法。
罗伯特·哈维

那么,服务层和存储库都将直接访问DBContext吗?因此,您会将CRUD放入Repo和Get方法以及服务层中的其他方法吗?我能正确理解吗?
Loren.Dorez '16

如果有服务层,则服务层可能会访问存储库,而不是直接访问EF。
罗伯特·哈维

@RobertHarvey您可以使用上面的“获取方法”给我展示一个示例吗?由于现在我有点困惑抱歉。
Loren.Dorez '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.