【转】ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定義了Repository常見的方法
AbpRepositoryBase:實(shí)現(xiàn)了IRepository接口的常見方法
?
EfRepositoryBase:實(shí)現(xiàn)了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實(shí)際項(xiàng)目中的RepositoryBase都是從EfRepositoryBase繼承的
?
?
IDbContextProvider/UnitOfWorkDbContextProvider:通過從ICurrentUnitOfWorkProvider對(duì)象的current屬性中獲取DBContext. 這個(gè)current屬性就是IUnitOfWork對(duì)象,具體到這筆就是EfUnitOfWork。
?
EfUnitOfWork:繼承自UnitOfWorkBase,結(jié)合EF的DBContext實(shí)現(xiàn)事務(wù)功能。同時(shí)DBContext是在這個(gè)對(duì)象中創(chuàng)建的,而且只從這個(gè)對(duì)象創(chuàng)建。其他需要DBContext的對(duì)象都是通過IDbContextProvider對(duì)象來獲取的。為什么EfUnitOfWork創(chuàng)建的DBContext實(shí)例變量可以通過IDbContextProvider對(duì)象獲取到呢?原因和UnitOfWork的實(shí)現(xiàn)過程有關(guān)。 在UnitOfWork中介紹過說有實(shí)現(xiàn)了IRespository接口的類都被加上了UOW攔截器,而UOW攔截器在攔截的時(shí)候會(huì)先創(chuàng)建EfUnitOfWork并將其放入ICurrentUnitOfWorkProvider對(duì)象中,通過ICurrentUnitOfWorkProvider對(duì)象的current屬性就可以獲取到EfUnitOfWork對(duì)象。進(jìn)而得到DBContext。
?
?
EntityFrameworkConventionalRegistrar:注冊(cè)所有以AbpDbContext為基類的類,并設(shè)置其構(gòu)造函數(shù)中的一個(gè)參數(shù)nameOrConnectionString的值。
AbpEntityFrameworkModule:完成EF module的注冊(cè),首先將EntityFrameworkConventionalRegistrar加到ABP的ConventionalRegistrar列表中,接著register UnitOfWorkDbContextProvider.
最后最關(guān)鍵的一步操作:調(diào)用EntityFrameworkGenericRepositoryRegistrar的RegisterForDbContext方法為每個(gè)DBContext中的entity通過反射創(chuàng)建一個(gè)EfRepositoryBase<entity>的類,并注入到容器中。這是ABP中值得贊的地方,帶來了很多便利。比如有一個(gè)person的entity。對(duì)于倉儲(chǔ)類,IRepository、EfRepositoryBase定義和實(shí)現(xiàn)的許多方法已足已應(yīng)付一般的需要。如果這些方對(duì)于實(shí)體person來說已足夠,我們便不需要再去創(chuàng)建這個(gè)實(shí)體所需的倉儲(chǔ)接口/類,直接使用EfRepositoryBase<person>就可以了。我們需要做的就是把EfRepositoryBase<person>注入到容器中就可以了。 接著在需要使用person倉儲(chǔ)類的地方,定義一個(gè)IRepository<person>對(duì)象就可以了。而使用ABP框架,你無需手動(dòng)的register這個(gè)EfRepositoryBase<person>類到容器里,ABP會(huì)自動(dòng)注入其通過EntityFrameworkGenericRepositoryRegistrar的RegisterForDbContext方法自動(dòng)生成并register這樣的類型。
AutoRepositoryTypesAttribute:通過給自定義的DbContext標(biāo)注AutoRepositoryTypes特性,可以指定自定義的倉儲(chǔ)類。默認(rèn)是register EfRepositoryBase<entity>的類到容器,通過特性可以register **RepositoryBase<entity>的類到容器。
?
?
?
返回ABP源碼分析系列文章目錄
總結(jié)
以上是生活随笔為你收集整理的【转】ABP源码分析二十七:ABP.Entity Framework的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网申信用卡额度都很低吗
- 下一篇: 【转】D365 FO第三方集成(三)--