如何解决 DbContext 中的循环依赖

Gre*_*Gum 5 c# entity-framework entity-framework-core asp.net-core

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

我已经设置了过滤器,但我很难TenantId访问DbContext.

困难的原因是UserManager用于获取当前登录用户的 和 取决于TenantIdDbContext数据库获取数据的 。因此,我无法使用UserManager依赖注入导入,因为它会导致循环依赖。取决于UserManagerDbContext并且DbContext取决于UserManager

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

小智 2

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

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.
}
Run Code Online (Sandbox Code Playgroud)

稍微改变一下应用程序的结构,使其像这样:

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
}
Run Code Online (Sandbox Code Playgroud)

唯一的要求:在依赖注入框架中将 IUserProvider 注册为单例