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源码分析系列文章目录

【转】ABP源码分析二十七:ABP.Entity Framework相关推荐

  1. 【转】ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...

  2. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  3. 【转】ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...

  4. 【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API

    ABP提供Script Proxy WebApi为所有的Dynamic WebApi生成访问这些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理.这些个代理就是j ...

  5. 【转】ABP源码分析二十九:ABP.MongoDb

    这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...

  6. 【转】ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用(该模块用于支持ABP框架单元测试的).一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能 ...

  7. 【转】ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

  8. 【转】ABP源码分析二十五:EventBus

    IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...

  9. 【转】ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

最新文章

  1. WinForm窗体设置
  2. TCP和UDP可以同时监听相同的端口
  3. 关于win10更新后谷歌浏览器打开卡慢或者无法上网的问题解决
  4. POJ - 1584 A Round Peg in a Ground Hole(综合几何)
  5. Jenkins打包之本地远程自动打包教程
  6. c语言最简单程序实例,C语言第一个简单实例
  7. Singleton patterns 单件(创建型模式)
  8. mysql分组查询n条记录
  9. 2021-06-21结构伪类选择器
  10. 设计模式学习02-观察者模式
  11. 小白入,告诉你.ssh新建config文件究竟是哪种文件!
  12. keras深度学习之猫狗分类三(特征提取)
  13. 单片机c语言直接寻址 间接寻址,pic单片机教程之数据存储器的直接间接寻址方式...
  14. matlab虚拟变量,不要再稀里糊涂的做回归了:如何设置哑变量
  15. 机器学习分类问题标签如何做编码
  16. cocos creator 发布IOS版本(一)从零开始,Xcode:12.0
  17. 某Xavier载板硬件方案
  18. 求助!!C++ int接收的式子有小数但是所有的计算结果都是整数,最终结果错误的灵异事件。
  19. 3.4.1 在物理层扩展以太网
  20. IP地址的概念和作用简析- -

热门文章

  1. 数学:乘法逆元-拓展GCD
  2. ORACLE快速遍历树及join基表很大的性能问题
  3. ALSA声卡12_从零编写之添加音量控制_学习笔记
  4. jQuery1.7.2正式发布了
  5. Oracle_11g_R1和R2官方下载地址
  6. .netframework3.5 中TimeZoneInfo 类的使用
  7. C语言实战:(2)字符串的倒转变换
  8. poj 2255 Tree Recovery 解题报告
  9. 企业是否应该实现对客户需求的快速响应_互联网企业的数据化迭代和数据化应用...
  10. java不同环境_Spring Boot系列 – 5. 不同的环境使用不同的配置