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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泛型实现List(ListT)排序

代码 publicclassPost : IComparable<Post>{ privatestringid string.Empty; privatestringtitle string.Empty; privateintorderby; publicstringID { get{ returnid; } set{ id value; } } pu…

华为鸿蒙与佳华,华为鸿蒙系统发布,带来三大好消息

华为在6月2日举办鸿蒙产品发布会&#xff0c;正式推出搭载鸿蒙操作系统的智能手机。这意味着此前只用于智慧屏、可穿戴设备等产品的鸿蒙操作系统终于覆盖到华为最主要的终端。从目前市场上的操作系统市场比例上看&#xff0c;安卓占据了全球68.63%&#xff0c;苹果占据了30.99%…

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

这个模块简单&#xff0c;且无实际作用&#xff08;该模块用于支持ABP框架单元测试的&#xff09;。一般实际项目中都有用数据库做持久化&#xff0c;用了数据库就无法用这个MemoryDB 模块了。原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍)&#xff0c;一般用了数…

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

这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类&#xff0c;封装了对MongoDb数据库的操作。 这个module通过引用MongoDB.Driver&#xff0c;MongoDB.Bson&#xff0c;MongoDB.Driver.Core,MongoDB.Driver.Legacy类库来操作MongoDb. 当项目不需要依赖于关系型…

html防替换资源,Webpack中有没有替换html静态资源的插件

比如html文件中有如下代码<div><!-- /dev 是开发目录 --><img src"/dev/img.png"></div>然后经过处理后变成如下<div><!-- /static 是上线目录, a7l3k2n是图片的hash --><!-- 同时把img.png从/dev目录移动到/static目录 --&g…

【转】ABP源码分析三十:ABP.RedisCache

ABP 通过StackExchange.Redis类库来操作Redis数据库。 AbpRedisCacheModule&#xff1a;完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRedisCacheConfig&#xff1a;定义了connectionStringKey和databaseIdAppSetting的值。这两个值对象redis 在web.config中的key值…

平板可以看html文档吗,iPad如何看电脑里的视频 如何使用Ipad看电脑里的电影

电脑上的视频怎么在iPad上观看&#xff1f;如何在ipad播放电脑中的视频首先&#xff0c;看你的视频格式。如果是mp4&#xff0c;就可以直接放入ipad自带浏览器或者通过itunes直接传。其他格式的需要下载第三方播放器&#xff0c;目前使用较多的支持高清播放的有Oplayer&#xf…

【转】ABP源码分析三十一:ABP.AutoMapper

这个模块封装了Automapper,使其更易于使用。 下图描述了改模块涉及的所有类之间的关系。 AutoMapAttribute&#xff0c;AutoMapFromAttribute和AutoMapToAttribute&#xff1a;这三个attribute用于标注一个类到另外一个类的map方向。 AutoMapperHelper: 通过调用Automapper的A…

SQL语言的事务机制_转摘

什么是数据库事务  数据库事务是指作为单个逻辑工作单元执行的一系列操作。设想网上购物的一次交易&#xff0c;其付款过程至少包括以下几步数据库操作&#xff1a;   更新客户所购商品的库存信息    保存客户付款信息--可能包括与银行系统的交互    生成订单并且保…

html背景定位,css background-position center left right top bottom代表意思

background-position:center right这里center right分别代表什么,引入对图片背景定位介绍background-position是用于定位背景图片中对象中显示定位&#xff0c;比如图片作为背景时在对象内什么位置开始显示&#xff0c;显示样式等。比如让一个图片作为对象背景距离对象左边或右…

【转】ABP源码分析三十二:ABP.SignalR

Realtime Realtime是ABP底层模块提供的功能&#xff0c;用于管理在线用户。它是使用SignalR实现给在线用户发送通知的功能的前提 IOnlineClient/OnlineClient: 封装在线用户的信息 OnlineClientManager/IOnlineClientManager: 用于提供基本维护在线用户的方法。其内部维护了…

【转】ABP源码分析三十三:ABP.Web

ABP.Web模块并不复杂&#xff0c;主要完成ABP系统的初始化和一些基础功能的实现。 AbpWebApplication : 继承自ASP.Net的HttpApplication类&#xff0c;主要完成下面三件事 一&#xff0c;在Application_Start完成AbpBootstrapper的初始化。整个ABP系统的初始化就是通过AbpBoo…

【转】ABP源码分析三十四:ABP.Web.Mvc

ABP.Web.Mvc模块主要完成两个任务&#xff1a; 第一&#xff0c;通过自定义的AbpController抽象基类封装ABP核心模块中的功能&#xff0c;以便利的方式提供给我们创建controller使用。 第二&#xff0c;一些常见的基础功能的实现。 AbpController&#xff1a;这是一个抽象基类…

地球化学图解系统GCDPlot 0.33

地球化学 图解 系统GCDPlot 0.33发布&#xff0c;新增了Excel 2007支持。下载 地址&#xff1a;GCDPlot下载GCDPlot 是一个进行地球化学图解、CIPW计算的 Microsoft Excel VBA 程序&#xff0c;GCDPlot 可以使用 Excel 的数据以标准的 Excel 图表格式绘制各类地球化学图解&am…

【转】ABP源码分析三十五:ABP中动态WebAPI原理解析

动态WebAPI应该算是ABP中最Magic的功能之一了吧。开发人员无须定义继承自ApiController的类&#xff0c;只须重用Application Service中的类就可以对外提供WebAPI的功能&#xff0c;这应该算是对DRY的最佳诠释了. 如下图所示&#xff0c;一行代码就为所有实现了IApplicationSer…

jstl处理栏目与子栏目_Detelogy智能前处理设备微展厅P2:再添新品

时隔小半年&#xff0c;新一轮Detelogy产品总览展示栏目再与大家见面。事不宜迟&#xff0c;点击视频即刻进入我们的智能前处理设备微展厅。 知乎视频​www.zhihu.com01 高效多样品前处理系统02 智能浓缩设备全系列03 智能湿法消解设备应用领域农残、兽残检测有机磷类、有机氯类…

【转】ABP源码分析三十六:ABP.Web.Api

这里的内容和ABP 动态webapi没有关系。除了动态webapi&#xff0c;ABP必然是支持使用传统的webApi。ABP.Web.Api模块中实现了一些同意的基础功能&#xff0c;以方便我们创建和使用asp.net webApi。 AbpApiController&#xff1a;这是一个抽象基类&#xff0c;继承自ApiControl…

408最后计算机网络题库,2021考研计算机统考408专业基础综合题库

**部分为历年考研真题。提供2009&#xff5e;2018年考研真题及参考答案&#xff0c;其中2009&#xff5e;2015年每道真题均提供详细答案解析&#xff0c;通过对真题的演练和分析&#xff0c;可以帮助学员牢牢抓住计算机学科专业基础综合考试的命题特点&#xff0c;提高复习效率…

Unity-Shader-渲染队列,ZTest,ZWrite

Unity-Shader-渲染队列&#xff0c;ZTest&#xff0c;ZWrite ZTest&#xff08;深度测试&#xff09;和ZWrite&#xff08;深度写入&#xff09;ZTest Less&#xff08;深度小于当前缓存则通过&#xff09;ZTest Greater&#xff08;深度大于当前缓存则通过&#xff09;ZTest L…

如何做好职业规划(乾卦)

职业一般来说会占用我们每个人生命中的大部分时间&#xff0c;而职业发展中变化莫测的因数常常令我们束手无策、捉襟见肘。在面对变化多端的情况时&#xff0c;中国人的传统智慧就发挥出最大的优势了。如何将快速变化 、不好掌控的事情处理得井井有条&#xff0c;这需要我们懂得…