如何解决DbContext中的循环依赖

时间:2018-03-26 03:28:32

标签: c# entity-framework asp.net-core entity-framework-core

我想在TenantId中设置DbContext,以便我可以使用它过滤所有查询。

我已设置过滤器,但我无法将TenantId设置为DbContext

困难的原因是用于获取当前登录用户的UserManager(以及TenantId)取决于DbContext从数据库获取数据。因此,我无法使用依赖注入导入UserManager,因为它会导致循环依赖。 UserManager取决于DbContextDbContext取决于UserManager

还有其他方法可以配置吗?

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你会遇到这样的情况:

public class UserManager : IUserManager
{
    public UserManager(IDBContext db, ... )
    {
        _context = db;
        ...
    }
    private IDBContext _context ;
    public UserInfo User {get; set;}
    // ... Some logic that fills User 
}

public class DBContext : IDBContext
{
    public DBContext(...)
    {
        ...
    }
    // ... Here you need UserInfo to filter.
}

稍微改变你的应用程序的结构,并按照这样做:

public class UserProvider : IUserProvider
{
    public UserInfo User {get; set;}
}

public class UserManager : IUserManager
{
    public UserManager(IDBContext db, IUserProvider provider, ... )
    {
        _context = db;
        _userProvider = provider;
        ...
    }
    private IDBContext _context ;
    private IUserProvider _userProvider;

    // ... Some logic that fills _userProvider.UserInfo 
}

public class DBContext
{
    public DBContext(IUserProvider provider, ...)
    {
        _userProvider = provider;
        ...
    }
    private IUserProvider _userProvider;
    // ... Here you can use _userProvider.UserInfo
}

仅限要求:在依赖注入框架中将IUserProvider注册为单身