DBContext 中具有 DBContextFactory 的作用域服务无法从根提供程序解析

Mat*_*ias 4 dependency-injection dbcontext entity-framework-core .net-core

我想注册一个作用域ICurrentUserService,然后在 DbContext 中使用它来设置CreatedBy每个实体的属性。我希望它具有作用域,因为它使用 currentHttpContext从声明中获取用户 id,并且 HttpContext 根据定义具有作用域。

services.AddTransient<ICurrentUserService, CurrentUserService>();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将其与 DbContextFactory 一起使用时,如下所示:

services.AddDbContextFactory<MyDbContext>(options =>
    options.UseSqlServer(config.ConnectionStrings.MSSQLConnection, x =>
        {
            x.MigrationsHistoryTable("...");
            x.MigrationsAssembly("...");
        }));

services.AddScoped<IMyDbContext>(provider => provider.GetRequiredService<IDbContextFactory<MyDbContext>>().CreateDbContext());
services.AddScoped<MyDbContext>(provider => provider.GetRequiredService<IDbContextFactory<MyDbContext>>().CreateDbContext());
Run Code Online (Sandbox Code Playgroud)

我收到错误

无法从根提供程序解析作用域服务“SomeNamespace.ICurrentUserService”。

我可以将其更改为 Transient,但这似乎是错误的,并且当我想模拟它并且每个类都会获得一个新实例时,这可能会成为稍后测试的问题。

我实际上不确定为什么 Scoped 在这里不起作用。DbContextFactory 已注册为 Singleton,但 Context 也被解析为 Scoped。

x4k*_*k3p 5

尝试一下ServiceLifetime.Scoped

services.AddDbContextFactory<ApplicationDbContext>(contextOptions => 
                    ... YOUR OPTIONS
), ServiceLifetime.Scoped);
Run Code Online (Sandbox Code Playgroud)