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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM