为啥我们在 DbContext 中使用 DependecyInjection 而不是 OnConfiguring 方法?

Posted

技术标签:

【中文标题】为啥我们在 DbContext 中使用 DependecyInjection 而不是 OnConfiguring 方法?【英文标题】:Why do we use DependecyInjection instead of OnConfiguring Method in the DbContext?为什么我们在 DbContext 中使用 DependecyInjection 而不是 OnConfiguring 方法? 【发布时间】:2022-01-04 20:10:30 【问题描述】:

我有一个名为 StudentDbContext 的类。我在其中调用了 OnConfiguring 方法。我看到在一些培训视频中使用了依赖注入。在这里,我们已经使用过一次上下文。为什么要使用依赖注入而不是 OnConfiguring?

选项-1

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        optionsBuilder.Usemysql("...");
    

选项2

public StudentDbContext(DbContextOptions<StudentDbContext> context) : base(context)
    

    

【问题讨论】:

数据库交互是 DI 的原型使用。您开发的应用程序通过接口与任何给定的 RDBS 进行交互。然后,您实现类来为每个受支持的 RDBS 实现数据库接口。我的主应用程序支持 SQL Server、Oracle、PostgreSQL、MySql 和 MS Access。如果您让您的客户决定他们更喜欢哪种 RDBS,那么您的应用程序将拥有更大的潜在客户群 【参考方案1】:
protected override void OnConfiguring(
    DbContextOptionsBuilder optionsBuilder)

    optionsBuilder.UseMySQL("...");

通过这种方法,您可以直接决定在StudentDbContext 中使用哪个提供程序(MySQL)和哪个连接字符串。如果要更改它以使用不同的提供程序或连接字符串,则必须直接修改 StudentDbContext 类。例如,假设您想为开发和生产使用不同的提供程序。

public StudentDbContext(DbContextOptions<StudentDbContext> context)
    : base(context)  

此方法允许您从 StudentDbContext 外部配置提供程序和连接字符串。

使用依赖注入,您会在Startup.ConfigureServices(或带有 ASP .NET Core 6 的 Program.cs)中看到类似的内容:

services.AddDbContext<StudentDbContext>(options =>

    options.UseMySQL("...");
);

当您想根据环境使用不同的提供程序/连接字符串(甚至其他设置)时,第二种方法会变得更加强大,例如:

if (hostEnvironment.IsDevelopment())

    services.AddDbContext<StudentDbContext>(options =>
    
        options.UseMySQL("...");
    );

else

    services.AddDbContext<StudentDbContext>(options =>
    
        options.UseSqlServer("...");
    );

【讨论】:

【参考方案2】:

通过依赖注入,DbContext 不需要知道实际使用的数据库。此外,DbContext 甚至不需要知道应该使用哪些配置设置来建立数据库连接。

这使您的代码更加独立。这例如使您的代码更具可测试性。还有其他优点。

【讨论】:

非常感谢:)【参考方案3】:

您还可以配置这两种方法以供使用

数据库上下文

protected override void OnConfiguring(
    DbContextOptionsBuilder optionsBuilder)

 if (!optionsBuilder.IsConfigured)
  
     optionsBuilder.UseMySQL("...");
  

或启动配置

  services.AddDbContext<StudentDbContext>(options =>
    
        options.UseMySQL("...");
    );

在这种情况下,如果您没有配置启动配置,或者如果您在另一个项目中使用您的数据库上下文而没有依赖注入,则将使用本地数据库上下文配置,否则将使用全局。

【讨论】:

以上是关于为啥我们在 DbContext 中使用 DependecyInjection 而不是 OnConfiguring 方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有多个 DbContext 类?

为啥 DbContext 不实现 IDbContext 接口?

为啥 EF Scaffold-DbContext 命令在针对 net6.0 报告“未找到设计时服务”后会引发 NRE?

使用映射从 edmx 生成 dbcontext 对象

SqlSugar之DbContext

如何更改 DbContext.SaveChanges() 的条目值