为什么我们在 DbContext 中使用 DependecyInjection 而不是 OnConfiguring 方法?
Why do we use DependecyInjection instead of OnConfiguring Method in the DbContext?
我有一个名为 StudentDbContext 的 class。我在其中调用了 OnConfiguring 方法。我看到一些培训视频中使用了依赖注入。这里我们已经使用了一次上下文。为什么我应该使用依赖注入而不是 OnConfiguring?
选项-1
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("...");
}
选项-2
public StudentDbContext(DbContextOptions<StudentDbContext> context) : base(context)
{
}
有了依赖注入,DbContext 不需要知道实际使用的数据库。此外,DbContext 甚至不需要知道应该使用哪些配置设置来建立数据库连接。
这使您的代码更加独立。这例如使您的代码更具可测试性。还有其他优点。
protected override void OnConfiguring(
DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("...");
}
通过这种方法,您可以直接决定在 StudentDbContext
中使用哪个提供程序 (MySQL) 和哪个连接字符串。如果您想更改此设置以使用不同的提供程序或连接字符串,则必须直接修改 StudentDbContext
class。例如,考虑一种情况,您希望为开发与生产使用不同的提供程序。
public StudentDbContext(DbContextOptions<StudentDbContext> context)
: base(context) { }
此方法允许您从 StudentDbContext
.
外部配置提供程序和连接字符串
使用依赖注入,你会在 Startup.ConfigureServices
(或 Program.cs 和 ASP .NET Core 6 中看到类似的东西:
services.AddDbContext<StudentDbContext>(options =>
{
options.UseMySQL("...");
});
当您想根据环境使用不同的 providers/connection-strings(甚至其他设置)时,第二种方法会变得更加强大,例如:
if (hostEnvironment.IsDevelopment())
{
services.AddDbContext<StudentDbContext>(options =>
{
options.UseMySQL("...");
});
}
else
{
services.AddDbContext<StudentDbContext>(options =>
{
options.UseSqlServer("...");
});
}
您还可以配置这两种方法以供使用
数据库上下文
protected override void OnConfiguring(
DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseMySQL("...");
}
}
或启动配置
services.AddDbContext<StudentDbContext>(options =>
{
options.UseMySQL("...");
});
在这种情况下,如果您不配置启动配置,或者如果您在另一个没有依赖注入的项目中使用数据库上下文,将使用本地数据库上下文配置,否则使用全局配置。
我有一个名为 StudentDbContext 的 class。我在其中调用了 OnConfiguring 方法。我看到一些培训视频中使用了依赖注入。这里我们已经使用了一次上下文。为什么我应该使用依赖注入而不是 OnConfiguring?
选项-1
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("...");
}
选项-2
public StudentDbContext(DbContextOptions<StudentDbContext> context) : base(context)
{
}
有了依赖注入,DbContext 不需要知道实际使用的数据库。此外,DbContext 甚至不需要知道应该使用哪些配置设置来建立数据库连接。
这使您的代码更加独立。这例如使您的代码更具可测试性。还有其他优点。
protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySQL("..."); }
通过这种方法,您可以直接决定在 StudentDbContext
中使用哪个提供程序 (MySQL) 和哪个连接字符串。如果您想更改此设置以使用不同的提供程序或连接字符串,则必须直接修改 StudentDbContext
class。例如,考虑一种情况,您希望为开发与生产使用不同的提供程序。
public StudentDbContext(DbContextOptions<StudentDbContext> context) : base(context) { }
此方法允许您从 StudentDbContext
.
使用依赖注入,你会在 Startup.ConfigureServices
(或 Program.cs 和 ASP .NET Core 6 中看到类似的东西:
services.AddDbContext<StudentDbContext>(options =>
{
options.UseMySQL("...");
});
当您想根据环境使用不同的 providers/connection-strings(甚至其他设置)时,第二种方法会变得更加强大,例如:
if (hostEnvironment.IsDevelopment())
{
services.AddDbContext<StudentDbContext>(options =>
{
options.UseMySQL("...");
});
}
else
{
services.AddDbContext<StudentDbContext>(options =>
{
options.UseSqlServer("...");
});
}
您还可以配置这两种方法以供使用
数据库上下文
protected override void OnConfiguring(
DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseMySQL("...");
}
}
或启动配置
services.AddDbContext<StudentDbContext>(options =>
{
options.UseMySQL("...");
});
在这种情况下,如果您不配置启动配置,或者如果您在另一个没有依赖注入的项目中使用数据库上下文,将使用本地数据库上下文配置,否则使用全局配置。