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

  • 相关阅读:
    Ubuntu使用PBIS认证
    命令行运行Python脚本时传入参数的三种方式
    Python中调用shell
    Install chocolatey
    Configure vyatta
    Linux: Block Port With IPtables
    转:PHPStorm+XDebug进行调试图文教程
    转 Fira Code | 为写程序而生的字体
    转 [PHP]
    转:Drupal 如何得到字段的值?
  • 原文地址:https://www.cnblogs.com/1zhk/p/5373902.html
Copyright © 2020-2023  润新知