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

Can I get a service from container before adding a DbContext to the services?

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

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

   // ...
}

但是,在这种情况下,我尝试使用构建在 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());
   });

   // ...
}

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

Error CS1929 'DbContextOptionsBuilder' does not contain a definition for 'GetRequiredService' and the best extension method overload 'ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider)' requires a receiver of type 'IServiceProvider'

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

AddDbContext 附带一个 overload 用于同时接受 IServiceProviderDbContextOptionsBuilder 的回调。

下面是一个演示如何使用它的示例:

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