具有 DBContextFactory 的 DBContext 中的作用域服务无法从根提供程序解析
Scoped service in DBContext with DBContextFactory can't resolve from root provider
我想注册一个作用域 ICurrentUserService
,然后在 DbContext 中使用它在每个实体上设置 CreatedBy
属性。我希望它有范围,因为它使用当前的 HttpContext
从声明中获取用户 ID,并且 HttpContext 根据定义确定范围。
services.AddTransient<ICurrentUserService, CurrentUserService>();
然而,当我尝试像这样将它与 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());
我收到错误
Cannot resolve scoped service 'SomeNamespace.ICurrentUserService' from root provider.
我可以将它更改为 Transient,但这似乎是错误的,并且稍后当我想模拟它并且每个 class 都会获得一个新实例时可能会成为测试的问题。
我实际上不确定为什么 Scoped 在这里不起作用。 DbContextFactory 是注册的单例,但上下文也被解析为 Scoped。
试试 ServiceLifetime.Scoped
services.AddDbContextFactory<ApplicationDbContext>(contextOptions =>
... YOUR OPTIONS
), ServiceLifetime.Scoped);
我想注册一个作用域 ICurrentUserService
,然后在 DbContext 中使用它在每个实体上设置 CreatedBy
属性。我希望它有范围,因为它使用当前的 HttpContext
从声明中获取用户 ID,并且 HttpContext 根据定义确定范围。
services.AddTransient<ICurrentUserService, CurrentUserService>();
然而,当我尝试像这样将它与 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());
我收到错误
Cannot resolve scoped service 'SomeNamespace.ICurrentUserService' from root provider.
我可以将它更改为 Transient,但这似乎是错误的,并且稍后当我想模拟它并且每个 class 都会获得一个新实例时可能会成为测试的问题。
我实际上不确定为什么 Scoped 在这里不起作用。 DbContextFactory 是注册的单例,但上下文也被解析为 Scoped。
试试 ServiceLifetime.Scoped
services.AddDbContextFactory<ApplicationDbContext>(contextOptions =>
... YOUR OPTIONS
), ServiceLifetime.Scoped);