【转】ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定義了Repository常見的方法
AbpRepositoryBase:實現(xiàn)了IRepository接口的常見方法
?
EfRepositoryBase:實現(xiàn)了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實際項目中的RepositoryBase都是從EfRepositoryBase繼承的
?
?
IDbContextProvider/UnitOfWorkDbContextProvider:通過從ICurrentUnitOfWorkProvider對象的current屬性中獲取DBContext. 這個current屬性就是IUnitOfWork對象,具體到這筆就是EfUnitOfWork。
?
EfUnitOfWork:繼承自UnitOfWorkBase,結合EF的DBContext實現(xiàn)事務功能。同時DBContext是在這個對象中創(chuàng)建的,而且只從這個對象創(chuàng)建。其他需要DBContext的對象都是通過IDbContextProvider對象來獲取的。為什么EfUnitOfWork創(chuàng)建的DBContext實例變量可以通過IDbContextProvider對象獲取到呢?原因和UnitOfWork的實現(xiàn)過程有關。 在UnitOfWork中介紹過說有實現(xiàn)了IRespository接口的類都被加上了UOW攔截器,而UOW攔截器在攔截的時候會先創(chuàng)建EfUnitOfWork并將其放入ICurrentUnitOfWorkProvider對象中,通過ICurrentUnitOfWorkProvider對象的current屬性就可以獲取到EfUnitOfWork對象。進而得到DBContext。
?
?
EntityFrameworkConventionalRegistrar:注冊所有以AbpDbContext為基類的類,并設置其構造函數(shù)中的一個參數(shù)nameOrConnectionString的值。
AbpEntityFrameworkModule:完成EF module的注冊,首先將EntityFrameworkConventionalRegistrar加到ABP的ConventionalRegistrar列表中,接著register UnitOfWorkDbContextProvider.
最后最關鍵的一步操作:調用EntityFrameworkGenericRepositoryRegistrar的RegisterForDbContext方法為每個DBContext中的entity通過反射創(chuàng)建一個EfRepositoryBase<entity>的類,并注入到容器中。這是ABP中值得贊的地方,帶來了很多便利。比如有一個person的entity。對于倉儲類,IRepository、EfRepositoryBase定義和實現(xiàn)的許多方法已足已應付一般的需要。如果這些方對于實體person來說已足夠,我們便不需要再去創(chuàng)建這個實體所需的倉儲接口/類,直接使用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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网申信用卡额度都很低吗
- 下一篇: 信义玻璃回购股票!回购股票对股价的影响