InvalidOperationException:检测到类型为“Microsoft.AspNetCore.Identity.UserManager”的服务存在循环依赖
InvalidOperationException: A circular dependency was detected for the service of type 'Microsoft.AspNetCore.Identity.UserManager
这是在我自定义 asp.net 核心身份服务以支持基于 This article 的多租户之后发生的。我对其进行了简化以满足我的需要。
这是我的基本设置。
1) 自定义应用程序用户
public class ApplicationUser : IdentityUser<int>, IEntityBase{}
2) 自定义角色
public class ApplicationRole : IdentityRole<int>, IEntityBase{}
3) 自定义角色商店
public class RoleStoreMultiTenant<TRole> : RoleStore<TRole, ApplicationDbContext, int>{}
4) 自定义用户存储
public class UserStoreMultiTenant<TUser, TRole, TKey> : UserStore<TUser, TRole, ApplicationDbContext, int>{}
5) 我的角色服务继承自上面(3)。这只是为了将我的代码与 RoleStore 覆盖的代码分开。
public class ApplicationRoleStore : RoleStoreMultiTenant<ApplicationRole>{}
6) 我的用户服务继承自上面 (4)。这只是为了将我的代码与 UserStore 覆盖的代码分开。
public class ApplicationUserStore : UserStoreMultiTenant<ApplicationUser, ApplicationRole, int>{}
7) 我的 ApplicationDbContext 是;
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>{}
8) 我的与身份相关的启动配置(在 ConfigureServices 中)。
services.AddScoped<IRoleStore<ApplicationRole>, ApplicationRoleStore>();
services.AddScoped<IUserStore<ApplicationUser>, ApplicationUserStore>();
services.AddIdentity<ApplicationUser, ApplicationRole>(o =>
{
o.User.RequireUniqueEmail = true;
//options code
}).AddUserStore<ApplicationUserStore>()
.AddEntityFrameworkStores<ApplicationDbContext, int>();
9) 在启动配置方法中我有;
//other code
app.UseIdentity();
//other code
10) 我有一个 basecontroller 期待下面通过构造函数注入
public BaseController(ApplicationDbContext dbContext,
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IMessageServices messageServices, ILoggerFactory loggerFactory,
AppTenant currentTenant, IMapper mapper)
{
_dbContext = dbContext;
_signInManager = signInManager;
_userManager = userManager;
_messageServices = messageServices;
_logger = loggerFactory.CreateLogger<BaseController>();
_currentTenant = currentTenant;
_mapper = mapper;
}
所有其他控制器都继承自该基础。
我的数据库迁移工作正常,使用我的自定义属性创建身份数据库结构没有任何问题。但是,当我 运行 应用程序时,我得到了主题中显示的错误。这是;
InvalidOperationException: A circular dependency was detected for the service of type 'Microsoft.AspNetCore.Identity.UserManager`1[Registrar.Data.MultitenantIdentity.Models.ApplicationUser]'.
堆栈跟踪显示所有框架代码,我发现很难找出 循环引用。
谁能给我指出正确的方向?
找到问题了。在 class;
public class ApplicationUserStore : UserStoreMultiTenant<ApplicationUser, ApplicationRole, int>{}
我在导致问题的构造函数中请求 UserManager。如果框架显示我的代码中的哪一行导致它失败,那就太好了。
这是在我自定义 asp.net 核心身份服务以支持基于 This article 的多租户之后发生的。我对其进行了简化以满足我的需要。
这是我的基本设置。
1) 自定义应用程序用户
public class ApplicationUser : IdentityUser<int>, IEntityBase{}
2) 自定义角色
public class ApplicationRole : IdentityRole<int>, IEntityBase{}
3) 自定义角色商店
public class RoleStoreMultiTenant<TRole> : RoleStore<TRole, ApplicationDbContext, int>{}
4) 自定义用户存储
public class UserStoreMultiTenant<TUser, TRole, TKey> : UserStore<TUser, TRole, ApplicationDbContext, int>{}
5) 我的角色服务继承自上面(3)。这只是为了将我的代码与 RoleStore 覆盖的代码分开。
public class ApplicationRoleStore : RoleStoreMultiTenant<ApplicationRole>{}
6) 我的用户服务继承自上面 (4)。这只是为了将我的代码与 UserStore 覆盖的代码分开。
public class ApplicationUserStore : UserStoreMultiTenant<ApplicationUser, ApplicationRole, int>{}
7) 我的 ApplicationDbContext 是;
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>{}
8) 我的与身份相关的启动配置(在 ConfigureServices 中)。
services.AddScoped<IRoleStore<ApplicationRole>, ApplicationRoleStore>();
services.AddScoped<IUserStore<ApplicationUser>, ApplicationUserStore>();
services.AddIdentity<ApplicationUser, ApplicationRole>(o =>
{
o.User.RequireUniqueEmail = true;
//options code
}).AddUserStore<ApplicationUserStore>()
.AddEntityFrameworkStores<ApplicationDbContext, int>();
9) 在启动配置方法中我有;
//other code
app.UseIdentity();
//other code
10) 我有一个 basecontroller 期待下面通过构造函数注入
public BaseController(ApplicationDbContext dbContext,
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IMessageServices messageServices, ILoggerFactory loggerFactory,
AppTenant currentTenant, IMapper mapper)
{
_dbContext = dbContext;
_signInManager = signInManager;
_userManager = userManager;
_messageServices = messageServices;
_logger = loggerFactory.CreateLogger<BaseController>();
_currentTenant = currentTenant;
_mapper = mapper;
}
所有其他控制器都继承自该基础。
我的数据库迁移工作正常,使用我的自定义属性创建身份数据库结构没有任何问题。但是,当我 运行 应用程序时,我得到了主题中显示的错误。这是;
InvalidOperationException: A circular dependency was detected for the service of type 'Microsoft.AspNetCore.Identity.UserManager`1[Registrar.Data.MultitenantIdentity.Models.ApplicationUser]'.
堆栈跟踪显示所有框架代码,我发现很难找出 循环引用。
谁能给我指出正确的方向?
找到问题了。在 class;
public class ApplicationUserStore : UserStoreMultiTenant<ApplicationUser, ApplicationRole, int>{}
我在导致问题的构造函数中请求 UserManager。如果框架显示我的代码中的哪一行导致它失败,那就太好了。