如何将范围服务注入DbContext?净核心

M U*_*M U 1 c# entity-framework-core .net-core asp.net-core

我正在构建多租户应用程序并尝试使数据安全性正常运行.Context的单元测试工作得很好,因为我用options和UserContext创建了上下文,但我很难让它在程序集中工作,因为它需要注入userContext.

我不能像其他一样使用标准控制器注入,就像我拥有它一样,上下文创建失败:

services.AddEntityFrameworkNpgsql()
                .AddDbContext<MultiTenantContext>(o =>
                    o.UseNpgsql(Configuration.GetConnectionString("DbContext")
Run Code Online (Sandbox Code Playgroud)

我不能或我不知道如何以这种方式注入我的UserContext ...

Chr*_*rdt 6

简单使用构造函数注入.它的工作方式与控制器相同.

public class MultiTenantContext : DbContext
{
    private UserContext _userContext;

    public MultiTenantContext(DbContextOptions options, UserContext userContext) : base(options)
    {
        _userContext = userContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要确保UserContext在注册实体框架之前注册服务.例如

services.AddScoped<UserContext, UserContext>();
services.AddEntityFrameworkNpgsql()
                .AddDbContext<MultiTenantContext>(o =>
                    o.UseNpgsql(Configuration.GetConnectionString("DbContext")
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于 dbcontext 池。即:services.AddDbContextPool,您需要有一个带有DbContextOptions的构造函数,因此构造函数依赖注入在这种情况下将不起作用。 (6认同)

LP1*_*P13 5

我假设您尝试Tenant根据 HttpRequest 中的登录用户查找多租户应用程序。你可以做这样的事情

public class UserContext
{
    private readonly IHttpContextAccessor _accessor;
    public RequestContextAdapter(IHttpContextAccessor accessor)
    {
        this._accessor = accessor;
    }

    public string UserID
    {
        get
        {
            // you have access to HttpRequest object here
            //this._accessor.HttpContext.Request
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ASP.NET Core 会自动注入IHttpContextAccessorUserContext

你也必须注册 UserContext

services.AddScoped<UserContext, UserContext>();
Run Code Online (Sandbox Code Playgroud)

然后使用构造函数注入注入UserContext任何你需要的地方