如何在 EF Core 中使用泛型仓储和工作单元模式

如何在 EF Core 中使用泛型仓储和工作单元模式

前言

稍微正式一点的后端程序不管是使用什么技术或思想,必定会涉及到一个数据持久化的过程,最近也在梳理自己的项目模板,在持久化数据的过程中,最常见的几个功能点,新增、修改、删除、根据主键获取数据信息,如果针对数据持久化对象都写一遍的话,又要多写很多的代码,这无疑很浪费时间,因此,在构建项目模板过程中,考虑通过仓储加工作单元的形式,对数据访问层的代码进行一次封装,以减少一些代码的编写

PS:对于 Entity Framework 来说,DbContext 本身就是工作单元,而 DbSet 则是仓储,因此,有些人觉得在 EF 上面再套一层仓储,显得不辣么聪明的样子,这篇文章不会去讨论这样做好与不好,因为在当前的这个场景下,它确实能够解决了我的痛点,去减少一些基础的代码编写,所以这里我会去使用,如果你也面临这些痛点,我觉得你可以考虑试试

这个项目模板是一个基础的 crud 单体项目,基本上是针对我目前工作和私下中遇到的一些问题所设计的,主要是为了简化我的一些开发,因为功能还没弄好,所以整个 repo 其实还是在不断完善中,仓储相关的代码可以从此处查阅:数据访问仓储

Step by Step

设计思路

在了解具体实现,先聊了一些领域驱动相关的知识点

在领域驱动中,仓储是为聚合所服务的,在聚合内部,聚合根起到串接聚合中其它数据的功能,并且起到一个维持整个聚合中所有对象的一个事务一致性的作用。而外界也只能通过聚合根来访问聚合内的数据,因此在领域驱动中通过对聚合根设置仓储,从而达到沟通聚合内外部数据的目的

例如我们在使用禅道这种项目管理软件时,当测试发现一个系统 bug,创建一条 issue 时,在解决 issue 的过程中,可能会存在多次的分配记录,可是当我们排除 issue 信息本身去看这些的分配记录时其实是没有任何意义的,也就是说在这个聚合中,我们可以把 issue 的基础信息看成是这个聚合的聚合根,与外界的聚合进行数据沟通,例如与专案聚合进行数据交互时,也是通过这个聚合根进行的

因此,这里会借鉴领域驱动中聚合的相关思想,虽然程序中使用的依旧是贫血模型,但是我们所定义的泛型仓储必须是聚合根才可使用

在定义仓储接口时,为了保持仓储的通用型,这里只会定义新增、修改、删除、根据主键获取数据信息这种几乎所有聚合根都会使用的通用方法,对于那种方法参数是一个委托,寄希望于动态构建通过各种条件来获取数据的,我更倾向于通过定义具体的数据访问方法来使代码的可读性更高,所以这里并不会在仓储中存在这种方法

通用的泛型仓储接口的定义如下

1
2


使用方法

新增

更新

删除

根据主键查询

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×