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源码分析十四:Entity的设计

    IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型 IEntity: 封装了PrimaryKey:Id,这是一个int类型 Entity< ...

  3. ABP源码分析二十四:Notification

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

  4. ABP源码分析二十五:EventBus

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

  5. ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...

  6. ABP源码分析二十九:ABP.MongoDb

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

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

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

  8. ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

  9. ABP源码分析二十一:Feature

    Feature是什么?Feature就是对function的分类方法,其与function的关系就比如Role和User的关系一样. ABP中Feature具有以下属性: 其中最重要的属性是name, ...

随机推荐

  1. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  2. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  3. 【java】Naming.bind和Registry.bind区别

    Naming类和Registry类均在java.rmi包 Naming类通过解析URI绑定远程对象,将URI拆分成主机.端口和远程对象名称,使用的仍是Registry类. public static ...

  4. Xshell 连接CentOS服务器解密

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html Xshell生成密钥key(用于Linux 免密码登录)htt ...

  5. SQLServer 版本之八大方法搞清 "我是谁"

    你正在使用 SQL Server 的哪个版本? 贴士:作为一个SQL Server数据库管理者或维护.支持人员,应该会经常问自己这样一个问题:我当前SQL Server版本号是?当前版本已经有的累计更 ...

  6. JS继承类相关试题

    题目一: //有关于原型继承的代码如下:function Person(name) {   this.name = name;}Person.prototype = {     getName : f ...

  7. 热修复-Nuwa学习篇

    nuwa热修复是基于qq空间团队的思路,最近的热度话题了,很多种方案,自己先研究几种方案,基本上都各有优势,学习肯定得先挑个软柿子捏了,自己对比了一下,发现nuwa代码量少点,所以就决定了,先研究nu ...

  8. SpringMVC视图解析器

    SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...

  9. Mysql - 函数

    Mysql提供的函数是在是太多了, 很多我都见过, 别说用了. 园子里面, 有人弄了一个比较全的. MYSQL函数 我这里会将他写的完全拷贝下来, 中间会插入一些自己项目中使用过的心得 一.数学函数 ...

  10. MySQL ALTER命令

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 开始本文教程前让我们先创建一张表,表名为:testalter_tbl. root@host# mysql -u r ...