在将 DbContext 添加到服务之前,我可以从容器获取服务吗?

Joh*_*ohn 3 c# entity-framework-core asp.net-core asp.net-core-3.1

我有一个基于 ASP.NET Core 3.1 的应用程序。我通常会DbContext使用这样的东西来注册

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(scope =>
   {
       scope.UseMySql(Configuration.GetConnectionString("ConnectionString"));
   });

   // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,在本例中,我尝试使用构建在 ASP.NET Core 3.1 框架之上的OrchardCore 。我需要使用该IDbConnectionAccessor服务来获取DbConnection. 所以,我可以注册AppDbContext,我想检索IDbConnectionAccessor

我试过这个

public void ConfigureServices(IServiceCollection services)
{
   services.AddDbContext<AppDbContext>(scope =>
   {
       var accessor = scope.GetRequiredService<IDbConnectionAccessor>();
       scope.UseMySql(accessor.CreateConnection());
   });

   // ...
}
Run Code Online (Sandbox Code Playgroud)

但该行var accessor = scope.GetRequiredService<IDbConnectionAccessor>();给了我以下错误

错误 CS1929“DbContextOptionsBuilder”不包含“GetRequiredService”的定义,并且最佳扩展方法重载“ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider)”需要“IServiceProvider”类型的接收器

在注册IDbConnectionAccessor之前如何获取实例?AppDbContext

Kir*_*kin 10

AddDbContext带有一个回调的重载,该回调同时采用IServiceProviderDbContextOptionsBuilder

这是一个展示如何使用它的示例:

services.AddDbContext<AppDbContext>((sp, options) =>
{
    var dbConnectionAccessor = sp.GetRequiredService<IDbConnectionAccessor>();
    options.UseMySql(dbConnectionAccessor.CreateConnection());
});
Run Code Online (Sandbox Code Playgroud)