ABP源码分析二十七:ABP.Entity Framework

本文详细解读了ABP框架中的Repository接口、AbpRepositoryBase类、EfRepositoryBase类以及UnitOfWorkBase类的实现原理。阐述了如何通过RepositoryBase泛型类简化Repository的实现,并通过IDbContextProvider/UnitOfWorkDbContextProvider和EfUnitOfWork实现事务管理。最后介绍了如何通过EntityFrameworkConventionalRegistrar和AbpEntityFrameworkModule完成EF模块的注册和DbContext的自动注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IRepository:接口定义了Repository常见的方法

AbpRepositoryBase:实现了IRepository接口的常见方法

 

EfRepositoryBase:实现了AbpRepositoryBase中定义的抽象方法:GetAll,Insert,Delete,Update。在实际项目中的RepositoryBase都是从EfRepositoryBase继承的

 

 

IDbContextProvider/UnitOfWorkDbContextProvider:通过从ICurrentUnitOfWorkProvider对象的current属性中获取DBContext. 这个current属性就是IUnitOfWork对象,具体到这笔就是EfUnitOfWork。

 

EfUnitOfWork:继承自UnitOfWorkBase,结合EF的DBContext实现事务功能。同时DBContext是在这个对象中创建的,而且只从这个对象创建。其他需要DBContext的对象都是通过IDbContextProvider对象来获取的。为什么EfUnitOfWork创建的DBContext实例变量可以通过IDbContextProvider对象获取到呢?原因和UnitOfWork的实现过程有关。 在UnitOfWork中介绍过说有实现了IRespository接口的类都被加上了UOW拦截器,而UOW拦截器在拦截的时候会先创建EfUnitOfWork并将其放入ICurrentUnitOfWorkProvider对象中,通过ICurrentUnitOfWorkProvider对象的current属性就可以获取到EfUnitOfWork对象。进而得到DBContext。

 

 

EntityFrameworkConventionalRegistrar:注册所有以AbpDbContext为基类的类,并设置其构造函数中的一个参数nameOrConnectionString的值。

AbpEntityFrameworkModule:完成EF module的注册,首先将EntityFrameworkConventionalRegistrar加到ABP的ConventionalRegistrar列表中,接着register UnitOfWorkDbContextProvider.

最后最关键的一步操作:调用EntityFrameworkGenericRepositoryRegistrar的RegisterForDbContext方法为每个DBContext中的entity通过反射创建一个EfRepositoryBase<entity>的类,并注入到容器中。这是ABP中值得赞的地方,带来了很多便利。比如有一个person的entity。对于仓储类,IRepository、EfRepositoryBase定义和实现的许多方法已足已应付一般的需要。如果这些方对于实体person来说已足够,我们便不需要再去创建这个实体所需的仓储接口/类,直接使用EfRepositoryBase<person>就可以了。我们需要做的就是把EfRepositoryBase<person>注入到容器中就可以了。 接着在需要使用person仓储类的地方,定义一个IRepository<person>对象就可以了。而使用ABP框架,你无需手动的register这个EfRepositoryBase<person>类到容器里,ABP会自动注入其通过EntityFrameworkGenericRepositoryRegistrar的RegisterForDbContext方法自动生成并register这样的类型。

AutoRepositoryTypesAttribute:通过给自定义的DbContext标注AutoRepositoryTypes特性,可以指定自定义的仓储类。默认是register EfRepositoryBase<entity>的类到容器,通过特性可以register **RepositoryBase<entity>的类到容器。

 

 

 

返回ABP源码分析系列文章目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值