dotnetcore / osharp

OSharp是一个基于.Net6.0的快速开发框架,框架对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、功能权限、数据权限等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net 框架更易于应用到实际项目开发中。
Apache License 2.0
2.79k stars 752 forks source link

重构数据迁移上下文提供器IDesignTimeDbContextFactory<TDbContext>接口的实现 #180

Closed gmf520 closed 4 years ago

gmf520 commented 4 years ago

您的功能请求与现有问题有关吗?请描述

原实现 SqlServerDesignTimeDefaultDbContextFactory.cs 存在以下几个问题,需要优化:

  1. 当进行数据迁移时,没有经过WebHost和Startup的初始化,无法提供一个IServiceProvider来提供IoC服务,需要手动读取配置文件获取数据库连接之类的配置
  2. 因为没有IServiceProvider,一切需要的服务都只能通过 new 的方式来获得实例,与.netcore一切皆服务的初衷格格不入
  3. 创建一个数据上下文实例,需要构建一个DbContextOptionsBuilder,在这 AddOsharpDbContext 已经构建过,可复用
  4. 需要针对每个数据库驱动进行 UseSql 的处理,这与EFCore模块中的DbContextOptionsBuilderDriveHandler重复了,可以复用

描述您想要的解决方案

针对如上几个问题,可以重构如下

  1. 移除数据库驱动平台差异,针对一个数据上下文(如 DefaultDbContext),只需要创建一个IDesignTimeDbContextFactory<TDbContext>接口的实现
  2. 当IServiceProvider不存在时,调用Startup进行IServiceCollection的构建,从而获得全服务的IServiceProvider
  3. 将 DbContextOptionsBuilder 的构建从AddOsharpDbContext提取出来进行复用
  4. 调用现有的各数据库驱动差异处理类DbContextOptionsBuilderDriveHandler进行各驱动的UseSql操作
  5. 如此,新的 DesignTimeDefaultDbContextFactory 只需要重写实现一个 CreateDesignTimeServiceProvider 方法即可,相比原先的一个驱动一个文件要简化很多
gmf520 commented 4 years ago

简化用于数据迁移的DesignTimeDefaultDbContextFactory设计,不同驱动统一使用一个类型,删除多余的其他类型