DAL中的存储库与服务模式:EF和Dapper

时间:2013-11-05 18:35:45

标签: asp.net-mvc entity-framework design-patterns dapper

我正在研究项目,我需要设计DAL。对于大多数项目,我将使用Entity Framework,对于某些对性能敏感的区域,我将使用Dapper

我正在考虑使用Repository模式但是EF在某种意义上已经实现了这种模式。但是Dapper的情况并非如此。然后我想知道在我的DAL中混合存储库和服务模式是否有效?或者这会进入业务逻辑层吗?

我想要建立的样本结构:

MyProjectName.Main
    Views/
    Controllers/
    Infrastructure/
    ...
MyProjectName.DAL
    DataService.EF/
        fileName.cs
        ...
    DataService.Dapper/
        fileName.cs
        ...

4 个答案:

答案 0 :(得分:9)

查看EF + Dapper Hybrid Implementation创建的Bradley Braithwaite

GitHub回购:https://github.com/bbraithwaite/HybridOrm

随附博客文章:ORM:Don't Reinvent the Wheel

在构建项目图层以避免“流血”方面,这是他如何做到的。

Project Layout

来自博客文章:Creating Data Repository Using Dapper

答案 1 :(得分:8)

我可以说你的问题很常见,并且有一个共同的解决方案 - CQRS (Command Query Responsibility Segregation)。当人们在他们的项目中练习DDD (Domain Driven Design)并且遇到 some performance-sensitive areas 的困难时,这种模式被广泛使用。

您将使用的ORM没有区别。拥有检索数据的不同组件是可以的。

您可以使用存储库或/和实体框架并使用 most of the project 的所有功能来执行 C -reate < strong> R -ead U -pdate D -elete操作。

但是对于 some performance-sensitive areas ,您可以使用查询。他们将返回由Dapper填充的DTO( R -ead操作)。

答案 2 :(得分:8)

EF或任何其他ORM未实现存储库。存储库旨在将域与持久性分离。 Domain使用域对象,EF / Nhibernate / Dapper等使用持久性实体,它代表关系数据库的 OOP视图

看到区别?一个需要业务对象,另一个需要处理数据结构。它们很相似,但它们不一样。域模型概念,行为和用例,持久性关心存储数据以便快速检索。责任不同。存储库充当它们之间的中介,“转换”持久性结构中的域对象,反之亦然。

始终,ORM是存储库的实现细节。对于CRUD应用程序,如果您没有域名,则直接处理数据库,即(微)ORM。在这种情况下,Repo仅作为一个外观才能为数据访问提供一些商业意义( GetOrders 更容易理解整个Linq或5行SQL连接3个表)。

Repository接口是在需要的地方定义的,但它是在Persistence(DAL)中实现的。与服务相同,它们可以在域中定义(作为接口),而它们的实现可以在DAL中。虽然Repository实现几乎总是DAL的一部分,但只有一些服务驻留在DAL中,原因很简单,因为它们更容易以这种方式完成工作。其他服务可以直接使用存储库(通常通过构造函数注入),也不要触及DAL。

无论您使用何种模式,都要尝试了解它们的实际目的,并始终考虑脱钩。

答案 3 :(得分:0)

我建议您观看本教程:Entity Framework in the Enterprise 在这里,作者非常好地解释了实体框架和存储库模式,最后,她实现了2个存储库:一个用于传统应用程序,另一个用于断开连接的应用程序。她提出的一个好处是,没有一件事适合所有人。基本上,您可以根据您的特定需求调整您的存储库。

对于您的情况,我将实现2个存储库:一个在EF顶部,另一个在Dapper。