InvalidOperationException:检测到类型为“Microsoft.AspNetCore.Identity.UserManager

时间:2017-07-30 08:06:20

标签: dependency-injection asp.net-core-mvc asp.net-identity-3

在我定制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)我有一个基础控制器,期望通过构造函数注入

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]'.

堆栈跟踪显示所有框架代码,我发现很难找出循环引用

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

发现问题。在课堂上;

public class ApplicationUserStore : UserStoreMultiTenant<ApplicationUser, ApplicationRole, int>{}

我在导致问题的构造函数中请求 UserManager 。如果框架显示我的代码中的哪一行使其失败,那将是很好的。